Discussion:
prob avec le type d'une variable
(trop ancien pour répondre)
Gilles
2006-06-08 02:57:16 UTC
Permalink
Bonjour
j'ai un probleme avec le type d'une variable, j'ai ecrit un petit programme
de test:
DIM nbre AS LONG
DIM aa AS LONG
aa= 6*10000
nbre=6300-aa

Lors de l'execution de ces lignes j'ai une erreur de "depassement de
capacité" pourtant les variables nbre ou aa definies en long devraient
pouvoir contenir les valeurs, il me semble qu'un long peut aller de -2 147
483 648 à 2 147 483 647.
Merci d'avance pour votre aide.
Gilles
Jean-marc
2006-06-08 17:36:17 UTC
Permalink
Post by Gilles
Bonjour
j'ai un probleme avec le type d'une variable, j'ai ecrit un petit programme
DIM nbre AS LONG
DIM aa AS LONG
aa= 6*10000
nbre=6300-aa
Lors de l'execution de ces lignes j'ai une erreur de "depassement de
capacité" pourtant les variables nbre ou aa definies en long devraient
pouvoir contenir les valeurs, il me semble qu'un long peut aller de -2 147
483 648 à 2 147 483 647.
Merci d'avance pour votre aide.
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,

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ; ***@yahoo.fr
Gilles
2006-06-08 21:41:01 UTC
Permalink
"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

Continuer la lecture sur narkive:
Loading...