Boucle For...Next...Step qui ne marche pas

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 7 mars 2007 à 20:31
 us_30 - 18 nov. 2007 à 22:38
Violent Ken



Bonjour, j'ai un problème à priori trivial à résoudre, mais je ne vois pas trop la solution...

Voici le code en question :



Option Explicit

Private Sub Form_Load()
Dim i As Currency
   For i = 0 To 400000 Step 2000
       Stop
   Next i
End Sub ,

----

By Renfield



Je lance, rien ne se passe...
Je change le 400000 en 40000 ou en 4000000 et çà marche...

Le problème se situe en fait au niveau du type Currency de i (car pas de problème en long).

Sans doutes un bug banal, quelqu'un aurait-il la solution ??

Merci d'avance, @+

34 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 mars 2007 à 20:44
Qu'est-ce qui marche et qui marche pas.

Avec ton programme, s'il doit marcher correctement, en fait il ne marchera pas, puisque dès la première itération , tu l'arrete avec l'instruction Stop

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 20:59
Je suppose que Vilent ne s'est pas arrêté ) celà, Casy...

Violent Ken,

Alors là que oui, que tu as excité ma curiosité !

Je n'ai pas la réponse logique mais voilà où nous en sommes :

la limite semble être, à un 10/1000 près :  :214748.364

Dieu seul sait pourquoi  !!!

Private Sub Command2_Click()
   Dim i As Currency
   For i = 0 To 214748.364 Step 200000 ' ou step ce que tu veux, celà ne changera rien...
       MsgBox i
   Next i
ens sub

J'essaye de comprendre (insomnies en perspectives, c'est certain...)
End Sub
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 21:06
Houlà !
Cà sent de plus en plis maivais !

Réaction jusqu'à

214748.36474
alors que j'ao dépassé les 4 décimales !

Va falloir interroger M. Bill (à moins qu'un balaise ne donne une explication qui m'échappe...)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
7 mars 2007 à 21:09
en effet c'est surprenant

la limite exacte c'est 214748.3647
alors que justement que la limite d'un Long est 2148483647 et que le Currency travaille avec 4 décimales
c'est la façon de travailler de Vb même si on met les données en Currency (début, fin et step)

Daniel
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
7 mars 2007 à 21:20
je voulais dire 2147483647 (2^31)
c'est quand même lié à un Long parce ça remarche à parir de 429496.7296
donc de 214748.3648 à 429496.7295 ça marche pas ????

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 21:27
Marche pô !!!
Qui a vu M. Bill ? Qui sait où le trouver ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
7 mars 2007 à 21:32
Bonsoir,
j ai trois passages dans :

For i = 0 To 214748.364 Step 200000 ' ..
       MsgBox i
Next i

à 0
à 200000
à 400000

quelle est la question ?
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
7 mars 2007 à 21:36
400000 n'est pas bon
met i en Double tu verras

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 21:37
Bonsoir, chibat05 (ça va bien ?)

La question est dans le toit premier message de Violent Ken...

et la réponse ? .... toujours pas là....
Nopus sommes les témoins d'un bug, apparemment !
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
7 mars 2007 à 22:02
Bonsoir jmfmarques,
apparement j' ai pas compris au premier abord...!
la question serait donc pourquoi le 3ième passage
alors que la limite est dépassée...
Peut être parce que tant que la lmite n' est pas atteinte
au deuxième passage, il franchit un pas de plus.
ça n' explique toujours pas pourquoi...
j' attenderais avec vous une réponse convaicante...
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
7 mars 2007 à 22:05
Violent Ken

Oups, mes excuses, je répond seulement après 9-10 posts...

J'avais aussi trouvé la limite 214748(sans les décimales), et j'ai remarqué le début de 2^31... donc je me suis dit que c'était lié au type, et c'est le cas puisqu'avec un Long pas de problèmes...

Mais franchement, je coince... j'ai recherché sur le Net rapidement, rien trouvé... et malheureusement, i contient un nombre dépassant les 2.10^11 dans mon programme, donc stockage obligatoire dans un Currency :(
(je ne peux utiliser un autre type)

Je vais essayer de faire quelques autres tests pour comprendre, et en tout cas déjà merci pour votre aide^^
@+
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 22:12
Pour chaibat05 :


Ma question est pourquoi , avec i en currency, on est limité à (environ... oublions les décimales...) 214748 alors que le type currency gère jusqu'à 922,337,203,685,477.5807. ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
7 mars 2007 à 22:30
chez moi c' est limité à 999 999 999
je me souviens avoir rencontré le même
problème dans un prog de conversion de
chiffres en lettres...(pas posible de gérer le milliard)

désolé de n' avoir rien compris ...
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
7 mars 2007 à 22:50
Violent Ken

En fait nous ne sommes pas limité à 214748, mais ce nombre est la "transition" entre une zone de valeurs qui marchent et une zone de valeurs qui ne fonctionnent pas.

Par exemple,



Option Explicit

Private Sub Form_Load()
Dim i As Currency
   For i = 0 To 40000000 Step 2000
       Stop
   Next i
End Sub ,

----

By Renfield

marche bien...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 mars 2007 à 23:00
salut,
euh... aucune info mais une idée

gobillot a mis :
déconne à partir de 214748.3648 jusqu'à 429496.7295

il y a un donc un équart de (2^31)-1
perso çà me fait penser à un type signé non?
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
7 mars 2007 à 23:07
en effet:

    For i = 200000 To 400000 Step -2000
        List1.AddItem i
        Next

Daniel
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
7 mars 2007 à 23:23
Violent Ken

Zut...
Me voilà alors bien embêté si je ne peux pas utiliser le type Currency... erf  -__-

Bon ben, il s'agit d'un bug et va donc falloir que je me creuse la tête pour parcourir les entiers de 0 à 2.10^11 ;)

Merci encore,  @+
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
7 mars 2007 à 23:29
voila une que j'aime bien:

    For i = 214748 To 214749 Step -1
        List1.AddItem i
        Next

sinon Violent Ken tu peux très bien travailler en Double, ça passe
ou alors utilise une boucle Do ou une boucle While:

    While i <= 400000
       List1.AddItem i
       i = i + 2000
       Wend

Daniel
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
7 mars 2007 à 23:33
Violent Ken

lol, j'avoue que l'exemple est assez frappant ;)

Et effectivement, le Doule devrait pouvoir convenir (le While marche bien entendu en dernier recours, mais je préfère le For...Next)

Merci, @+
0
Profil bloqué
7 mars 2007 à 23:42
encore plus fort

Option Explicit

Private Sub Form_Load()
Dim i As Currency
For i = 0 To 200000 Step 20000
        List1.AddItem i
        Next
End Sub

La liste va de 0 à 420000

Faites la même chose avec  "dim i as long" et cela est correct

Pour Violent _Ken : et si tu essayais avec les Long Integer en convertissant ton currency en 2 valeurs sur 32 bits ( prends modèle sur la routine DirectReadWrite de l'accès direct aux secteurs disque où on convertit le numéro de secteur  en 2 valeurs 32 bits) :  il faudrait peut-être utiliser une double boucle For imbriquée  ( une pour les 32 poids forts et une pour les 32 poids faibles)
Sans aucune certitude

A+ et bonne prog
Galain

GRENIER Alain[8D]
0
Rejoignez-nous