Pb avec les gds nombres (10^26)

Résolu
Loozerteam Messages postés 17 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 27 avril 2008 - 26 avril 2008 à 18:11
Loozerteam Messages postés 17 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 27 avril 2008 - 27 avril 2008 à 01:37

7 réponses

Profil bloqué
27 avril 2008 à 01:11
Voici le code que j'ai fait

Public Function BinToLettre(BinVal as String) As String
   Dim sortie As String, i As integer, my_lettres As String,chiffre as String
   my_lettres = "ZYXWVUTSRQPONMLKJIHGFEDCBA"
   sortie =""
   For i = len(Binval) to 1 step -1  ' on explore BinVal de droite à gauche
      chiffre = mid$(BinVal,i,1) ' chiffre de BinVal (0 ou 1)      if chiffre "1" then sortie sortie & mid$(my_lettres,i,1) ' si = 1 : lettre de la même position
   Next i
   BinToLettre = sortie
End Function

GRENIER Alain
3
Loozerteam Messages postés 17 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 27 avril 2008
26 avril 2008 à 18:22
heu .... je crois qu'il y a eu un beug, mon message est vide, et c'est reparti pour un tour ^^

Msg original:
Bonjour, j'ai créé une fonction qui a un binaire associe une chaine de caractère.
Son "schéma" est le suivant: 1 -> A  ;  11 -> BA  ;  1000000000000000000000000 -> Z ...

Voici ma fonction:
Public Function BinToLettre(BinVal As String) As String
Dim sortie As String, length As Byte, my_lettres As String
length = Len(BinVal)
my_lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Do While BinVal <> 0
MsgBox BinVal
sortie = sortie &amp; Mid(my_lettres, length, 1)
BinVal = BinVal - (10 ^ (length - 1))
length = length - 1
Loop
BinToLettre = sortie
End Function


J'ai un problème au niveau de mon surlignement en rouge. En effet, je ne sais pas quelle typage utiliser.
Mon problème (vérifié par la MsgBox) est qu'après la première redéfinition de BinVal, celle-ci est arrondie, elle vaut en effet: "1,11111111111111E+24" si j'ai appelé "BinToLettre(111111111111111111111111111)" (il y'en a 26).
Cela n'est pas cool, car du coup "BinToLettre(11..11)" renvoit "Z...K" autrement dit que 16 lettres au lieu de l'alphabet entier ...

Merci d'avance.
http://loozerteam.tk
0
Profil bloqué
27 avril 2008 à 00:45
Salut Lozerteam
Si j'ai compris ta fonction A --> 1 ,  11 -->BA , 101 -->CA (  on ne met pas le B car le bit est à 0)
donc 10000000000000000000000000 donne Z ( 1 suivi de  25 zéros) et 10000000000000000000000001 donne ZA ( 1 suivi de 24 zéros puis un 1)

Soit la String 111000111 en paramètre de ta fonction
Cela doit donner "IHGCBA"  comme résultat

Dans ta fonction tu mets comme paramètre Binval as String et dans le code de la fonction tu codes : Do While BinVal <> 0 ( là Binval n'est pas une chaine de caractères mais une valeur numérique)

J'aurais bien un code à te proposer pour solutionner ton problème mais je voudrais être sur de bien avoir compris la fonction que tu désires coder

J'attends ta réponse pour confirmer si j'ai bien compris ou non
A+
GRENIER Alain
0
Loozerteam Messages postés 17 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 01:00
Salut, Galain, tout à fait, tu as tout compris, en effet j'ai mis binval as string en "attendant" de trouver une réponse ^^.
Merci pour ta future réponse
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Loozerteam Messages postés 17 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 01:20
Hum ... ca marche mais du coup, my_lettres="ABCDEFGHIJKLMNOPQRSTUVWXYZ" car la boucle s'effectue dans l'autre sens ou alors For i =1 to  len(Binval) ...
Mais merci, il n'y a donc pas de solutions miracle pour que vb ne fasse pas d'arrondi ?
Au cas où un jour pour un autre pb j'en aurais besoin ...
http://loozerteam.tk
0
Profil bloqué
27 avril 2008 à 01:34
C'est ce que je me suis aperçu en testant mon code
L'astuce consiste à faire de façon que Binval fasse 26 caractères en rajoutant des zéros à gauche

Public Function BinToLettre(BinVal as String) As String
   Dim sortie As String, i As integer, my_lettres As String,chiffre as String
   my_lettres = "ZYXWVUTSRQPONMLKJIHGFEDCBA"
   BinVal = String(26 - Len(BinVal), "0") & BinVal ' rajoute les zéros à gauche
   sortie =""
   For i = len(Binval) to 1 step -1  ' on explore BinVal de droite à gauche
      chiffre = mid$(BinVal,i,1) ' chiffre de BinVal (0 ou 1)      if chiffre "1" then sortie sortie & mid$(my_lettres,i,1) ' si = 1 : lettre de la même position
   Next i
   BinToLettre = sortie
End Function
GRENIER Alain
0
Loozerteam Messages postés 17 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 01:37
Mon code final:

Public Function BinToLettre(BinVal As String) As String
   Dim sortie As String, i As Integer, my_lettres As String, chiffre As String
   my_lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   sortie = ""
   For i = 1 To Len(BinVal) ' on explore BinVal de droite à gauche
      chiffre = Mid$(BinVal, i, 1) ' chiffre de BinVal (0 ou 1)      If chiffre "1" Then sortie sortie & Mid$(my_lettres, i, 1) ' si = 1 : lettre de la même position
   Next i
   BinToLettre = sortie
End Function

Il est tout aussi simple, et en plus le résultat est renvoyé classé par ordre alphabétique, encore mieux !!!

Merci, bcp et bonne nuit.
0
Rejoignez-nous