"Jean-marc" <jean-***@tiscali.be> a écrit dans le message de news:
***@y43g2000cwc.googlegroups.com...
Hello Gilles,
C'est une erreur classique, mais un peu surprenante
quand on la rencontre pour la première fois.
L'erreur se produit sur la ligne:
aa = 6 * 10000
la raison est simple:
6 est une constante entière, de type Entier (Integer)
10000 est une constante entière, de type Entier (Integer)
Quand tu demandes à VB de calculer 6 * 10000, il applique une
règle (parfaitement documentée) qui est que VB essaie de stocker
le résultat intermédiaire du calcul dans le type le plus
contraignant (ici: Integer) avant même d'affecter à la variable
aa.
Donc il fait (6 * 10000) = 60000 et il essaie de strocker en interne
60000 dans un Integer, ce qui ne marche pas (les integer sont limités
à l'intervalle -32768,+32767. D'ou un "dépassement de capacité".
COmment résoudre le problème?
Simplement en convertissant explicitement les 2 constantes en Long
avant d'affecter, comme ceci:
aa = CLng(6) * CLng(10000)
Note: il suffit même d'en convertir une seule, car VB applique
alors pour le stockage intermédiaire le type le plus
contraignant. Ainsi, les 2 formes suivantes fonctionneront
aussi sans problème:
aa = 6 * CLng(10000)
aa = CLng(6) * 10000
Une façon plus propre de faire est de déclarer des constantes
correctement typées, comme ceci:
Dim nbre As Long
Dim aa As Long
Const C_VAL1 As Long = 6
Const C_VAL2 As Long = 10000
aa = C_VAL1 * C_VAL2
Note que dans tous les cas la ligne
nbre = 6300 - aa
ne pose pas de problèmes car aa est un Long, 6300 est un Integer,
VB applique donc la rêgle du type le plus contraignant et stocke
son résultat intermédiaire dans un Long, ce qui est OK.
Note: ce groupe de discussion est malheureusement en fin de vie, il n'y
a presque plus d'activité. En revanche, le groupe
microsoft.public.fr.vb est lui très actif et on y parle de VB :-)
Cordialement,
Bonjour
Et merci pour ta reponse tres documenté, en faite mon programme est en Quick
basic 4.5 , sur un autre forum, plus specialisé qbasic, on m'a donné une
solution qui fonctionne, sans vraiement connaitre la raison qui fait que
cela marche, c'est en ajoutant le signe # apres 10000, ma ligne devient aa =
6 * 10000#, mais en fait on peut tres bien en suivant ton raisonement ecrire
aa = 6 * 10000& ce qui revient à reserver pour 10000 la place pour un long.
Encore merci pour ta reponse.
Gilles