Au secours de toute ma vie je n'ai jamais vu ça

Résolu
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006 - 9 nov. 2005 à 20:53
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 10 nov. 2005 à 15:38
voila j'ai un problème.
cela fait maintenant assez longtemps que je programme en VB mais là je bloque

voici mon code ; il est tout simple :

Private Sub Command1_Click()
Dim CC As Long
CC = 11600 + 19200 + 4000
Print CC
End Sub

et là quand j'execute mon programme j'ai
Erreur d'exucution 6 : dépassement de capacité

et le débogage me renvoie ici : CC = 11600 + 19200 + 4000

alors là...
je ne comprend pas
j'ai pourtant déclaré ma variable en LONG
la fourchette devrait etre comprise entre -2 147 483 648 à 2 147 483 647

à ce que j'ai pu comprendre, il me limite CC à une variable Integer (fourchette -32 768 à 32 767), donc quand je dépasse ça me met cette erreur (ici CC = 34800)

mais pourquoi ???? je l'ai déclarée en LONG !
rohlala dès que j'ai un gros projet les ennuis arrivent

pouvez vous vérifier sur votre bécane pour voir si c'est la mienne qui fait des siennes ?

merci beaucoup à tous
plhea

19 réponses

jpleroisse Messages postés 1788 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 11 mars 2006 27
9 nov. 2005 à 21:09
Bonsoir,

J'ai essayé ton code et effectivement il me met Dépassement de Capacité.

Mais comme ceci celà fonctionne.



Private Sub Command1_Click()

Dim CC

CC = CLng(11600) + CLng(19200) + CLng(4000) + CLng(25000)

MsgBox CC

End Sub



jpleroisse



Si une réponse vous convi.ent, cliquez Réponse Acceptée.
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 nov. 2005 à 21:16
Et oui, si tu ne lui dit pas de faire le calcul en Long, il te fera le
calcul en integer vu que les nombres que tu additionnes sont des
integer.



C'est comme si tu fait une multiplication entre deux integer, il te le convertit pas automatiquement en long durant le calcul !

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
3
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006
9 nov. 2005 à 21:20
waou waou waou jamais vu ça !
effectivement ça marche et je suis content que ça fait ça pour tout le monde
mais je ne comprends toujours pas la raison

y aurait il un BUG dans visual basic 6 ???
ou est ce que c'est absolument normal et je suis plus qu'ignorant

si quelqu'un y voit une explication logique je suis ouvert et je vous remercie d'avance
merci à tous

plhea
0
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006
9 nov. 2005 à 21:25
EDIT (desolé je sais pas comment éditer)

MERCI beaucoup DarkSidious (désolé j'ai posté sans avoir lu ton message)
ok je comprends mieux j'ai fait quelques essais et tu as raison

merci pour vos aides à tous

plhea
0

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

Posez votre question
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
9 nov. 2005 à 21:27
Salut,

Bah c'est vrai que c'est bizarre, en même temps, si tu entres toi même 3 chiffres comme ca à la suite par programmation tu dois être capable de faire la somme par toi même !! lol
Et comme ca cela fonctionne (2 manières) :

Méthode 1
Private Sub Command1_Click()
Dim CC As Long
CC = 11600
CC = CC + 19000
CC = CC + 4000
Print CC
End Sub

Méthode 2
Private Sub Command1_Click()
Dim CC As Long
Dim value1 As Long
Dim value2 As Long
Dim value3 As Long


value1 = 11600
value2 = 19200
value3 = 4000


CC = value1 + value2 + value3
Print CC
End Sub

Je sais c'est con comme exemple mais ca me semble plus logique avec des variables. Mais je te l'accorde, je sais pas pourquoi VB ne le prends pas en compte .... Peut être un beug de VB mais perso je ne vois pas l'interêt de ce genre de structure en programmation ! Mais c'est rai que c'est une question intéressante.

Phil
Bye
0
daetips Messages postés 142 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 10 novembre 2007
9 nov. 2005 à 21:30
Dim CC as long

Daetips
0
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006
9 nov. 2005 à 21:32
le code exact était

AugmenterPoints ((11600) + (19200) + (4000))

en fait c'était juste pour me simplifier la vie dans ma relecture
en effet, le 11600, le 19200 et le 4000 sont 3 choses différentes et j'ai préféré les séparer en pensant - à tort - que ça n'allait rien changer

plhea
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
9 nov. 2005 à 21:35
OK Darksidiou mais si tu déclares le résultat de ton opération en Long c'est ilogique de devoir convertir les nombre en Long puisque le résultat de l'addition de tous les nombres est plus petite que la limite supérieure qu'accepte un Long (2
147 483 647). Les entiers ayant une limite inférieure (32 767).
Je dois peut être être con mais je saisis mal ... lol.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 nov. 2005 à 21:37
Je pense que c'est pour une raison d'optimisation : additionner des
entiers sur 2 octets est forcément plus rapide que des entiers sur 4
octets ! (et c'est d'autant plus vrai pour les opérations lourdes
telles que multiplications ou modulo).



Du coup, VB prend le type de données le plus petit possible pour faire l'addition, et si ca dépasse, tant pis pour toi.



Dans ton premier exemple, tu additionne un long avec un integer, donc
VB renvoie un long, par contre, un integer avec un integer renvoie un
integer, même si la variable stockant le résultat est un long !



Sinon, je tiens à remercier daetips qui a tout compris au schmilblick :) lol

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
0
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
9 nov. 2005 à 21:57
Oui je n'avais pas pensé à cela mais je pense que tu as raison : c'est forcément plus rapide sur 2 octets ! Maintenant il est peut être dommage que dans VB il n'y est pas prévu une sorte d'échapatoire ou quand ca beuge, il refait le calcul en long et seulement à ce moment il génére une erreur si le résultat est supérieur à 2
147 483 647. Un peu comme fonctionne les On GoTo Error.

Mais c'est bon à savoir et je te remercie de ta contribution, c'est toujours instructif ! Bonne question plhea

c'est vrai que daetips a tout pigé ...
0
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006
9 nov. 2005 à 22:15
j'adore ça !
intéréssant et intriguant à la fois
décidement on apprend tous les jours

et tant que j'y suis daetips je te remercie beaucoup pour ton aide

plhea
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
10 nov. 2005 à 00:19
C'est clair que c'est étrange cet histoire!
Bon, c'est certain que Philippe a raison consernant l'inutilité de mettres les valeurs quand on peut rapidement faire le calcul nous même. D'autant plus si, tes chiffres étants séparés par un "+" tu les mets entre parenthèses!!!
Pi pour la clarté du code, tu sais, on a inventé les commentaires

Moi ce qui m'étonne avec vos explication c'est que :
CC = CLng(11600 + 19200 + 4000)
Ne fonctionne pas non plus!!! Alors que si on suit ton raisonnement Darky, ça devrait pourant fonctionner!
Je pense cependant que tu as raison... ca ne peut être que ça!
N'empêche, comment expliquer que :
- La fonction CLng n'accept pas de valeurs Long ??? Alors qu'il ne devrait normalement pas y avoir de limitation du type!
- Que lorsqu'on ne type rien ça s'auto-type en Variant de 32 bits alors que VB optimise les calculs en Integers !?!?!?!?!? Quel sens donner à tout ça, à la philosophie sous-jascente ???

Enfin, c'est clair que c'est toujours bon à savoir même si, entre nous, ce cas ne devrait pas nous arriver dans une programmation plus "traditionnelle" !

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 nov. 2005 à 01:29
CC = CLng(11600 + 19200 + 4000)




les calculs se font comme ça:
1) 11600 + 19200

comme ce sont des constantes, elles sont prises en Integer


soit résultat = 30800 --> ça passe



2) 30800 + 19200

toujours des Integers



soit résultat = 34800 --> dépassement de capacité



le Clng ne joue donc pas, puisqu'il le plantage a lieu avant



ça passe:

CC = 11600 + 19200 + 4000&


CC = 11600 + 19200 + CLng(4000)


CC = 11600 + CLng(21200) + 4000



ça passe pas:


CC = 11600 + 21200 + 4000&


CC = 11600 + 21200 + CLng(4000)







Daniel
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 nov. 2005 à 01:38
1- CC = CLng(11600 + 19200 + 4000) ne fonctionne pas car comme l'a dis DS, le calcul se fait sur des integer en VB, du moins par défaut !
2- Vous noterez que "cc = CLng(11600 + 19200 + CLng(4000))" marche tres bien : En effet, le fait de convertir unes des operandes en long, force VB à typecasté implicitement tout ce petit monde en long !
3-Clng() accepte tout a fait un long ! J'en veux pour preuve que cc = CLng(34800) fonctionne tres bien, et 34800 est un long ! C'est 11600 + 19200 + 4000 qui est illicite pour VB !
2- Le type par défaut est le variant et le type NUMERIQUE pris par VB par défaut les l'integer, et je ne vois pas ou est le défaut la dedans ! VB a pris la philosophie de dire que ce qui n'est pas type au moment de la DECLARATION est variant alors on cause de nos variables, nos constantes et autres fonctions la OK ? Alors que quand VB décide de considerer 11600 comme un integer, il ne s'agit pas "d'auto-typé" une déclaration, mais de déterminer le type d'une valeur.
3- De la meme facon qu'une valeur commancant par un caractère " et finissant par le meme caractère " est considérer comme une string, une valeur commencant par un digit, un + ou un - et constitué uniquement de digit par la suite est à priori considéré comme un integer, sauf si sa valeur ne tient pas dans 2 octets auquel cas VB tente le coup avec un long ! Le but est d'avoir les représentation s de valeur les plus petite possible en mémoire, car pour un code machine, plus il y a d'octet à manipuler, plus c'est long ! Enfin la, je dois corriger ! Vous savez qu'en VB il vaut mieux travailler en Long plutot qu'en Integer ? En effet, l'integer est sur 2octets, donc 16bits et le long sur 4o, donc 32bits. OPr, nos PCs actuels ont un bus de donnée de 32bits, et nos proc sont des 32bits et préfère donc travailler sur leur mot (=32b) plutot que sur leur demi-mot(=32/2=16b). Le partie pris pour l'integer par VB a été pris à l'époque des précédente version de VB (VB4) qui tournait sur des bécanes 16b et générait du code 16b. Avec VB5, on pouvait faire du code 16b ou du code 32b sur une machine 32b,et avec VB6 on fait du 32b sur des machines 32b. MAIS VB n'a pas lâcher l'Integer pour autant, car Microsoft n'a pas voulu refondre tout VB a la sortie de la version 6 car .NET était déjà dans les cartons et VB6 mort avant de naitre (pour Crosoft du moins !!!).
Voila ! J'espere ne pas vous avoir embeter avec ce cours sur la base de la programmation VB (par "de base" je veux dire qu'il concerne les fondements du langage VB, pas que c'est du niveau d'un developpeur débutant !)

CR
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 nov. 2005 à 01:50
1) ce serait dommage d'abandonner les Integers,

l'avantage c'est qu'ils prennent moins de place, mais en temps de traitement

c'est légèrement un peu plus Long ( tient !)


2) le type de la constante est pris en fonction de sa valeur:

39200 sera considéré en Long

le type résulktat est celui du plus grand: Integer + Long --> Integer

donc ce calcul passe sans problèmes

CC = 11600 + 39200 + 4000


Daniel
0
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006
10 nov. 2005 à 13:47
crenaud >
avant lire ton message j'étais persuadé que les variables integer avaient une temps de traitement plus court que les long
mais c'est vrai qu'avec les processeurs 32bits ça ne devrait rien changer
et justement tu dis que c'est plus rapide avec les longs que les integer
pourquoi? ça devrait être exactement pareil non ?

et bientot avec les 64bits on fera que des Double
là on aura de la marge

mais avec les double on ne peut pas avoir d'entiers ?
(fourchette ± -10^-307 à ± 10^308)
enfin il ne pourra pas effectuer la conversion automatique de :

Dim ABC As Integer
ABC = 2.43
Print ABC

ici 2.43 est converti en 2

mais dans le cas d'une variable Double
Dim ABC As Double
ABC = 2.43
Print ABC

ici 2.43 n'est pas converti en 2
il aurait fallu mettre
Dim ABC As Double
ABC = Clng(2.43)

mais si on veut un entier très très très grand
Dim ABC As Double
ABC = clng(10.2^307)

ici on veut un entier > il faut convertir 10.2 ^307 en long ou integer
mais dans ce cas là on se prive de l'enorme fourchette du Double !
puisque il y a dépassement de capacité avec le Clng

alors comment avoir des entiers très très grands ?
je crois avoir vu qu'il est possible de faire des calculs binaires en C
çàd on fait une fonction qui supprime la mantisse du double passé en argument

:) j'ai résolu mon problème tout seul non ?
mais je n'ai aucune idée de comment faire ça

plhea
0
plhea Messages postés 45 Date d'inscription dimanche 13 mars 2005 Statut Membre Dernière intervention 19 mars 2006
10 nov. 2005 à 13:50
je voulais aussi dire
est ce que ça existe déja ou est ce qu'il est prévu de faire des entiers 8 octets pour les processeurs 64 bits?

plhea
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 nov. 2005 à 14:21
En VB.NET on a le Int64 !
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
10 nov. 2005 à 15:38
Wai, enfin, disons que, pour ce qui concerne le fait que les Long soient plus rapides que les Integer moi je crois surtout que c'est une question de flemme de la part des codeurs du VB car en réalité (c'est la MSDN qui le dit), les deux utilisent une seule et même fonction (ce qui explique pas mal de choses!).

En ce qui concerne l'utilisation des entiers dans notre cas, je pense quand même que VB aurait du penser à ce cas de figure. Après tout, les opérations arithmétiques font parti des fondamentaux et que le fait d'en cumuler fait - presque - obligatoirement appel à des changements de type!!!
Enfin, ce qui est fait l'est et on y peut pas grand chose.

Juste une question sur le .Net :
Il y a combien de types différents ???
0
Rejoignez-nous