plhea
Messages postés45Date d'inscriptiondimanche 13 mars 2005StatutMembreDernière intervention19 mars 2006
-
9 nov. 2005 à 20:53
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDerniè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 ?
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 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.
plhea
Messages postés45Date d'inscriptiondimanche 13 mars 2005StatutMembreDernière intervention19 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
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 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.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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/
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 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
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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 !)
plhea
Messages postés45Date d'inscriptiondimanche 13 mars 2005StatutMembreDernière intervention19 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
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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 ???