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

Signaler
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
 us_30 -
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
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 #
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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...)
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Marche pô !!!
Qui a vu M. Bill ? Qui sait où le trouver ?
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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 ?
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
400000 n'est pas bon
met i en Double tu verras

Daniel
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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 !
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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...
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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^^
@+
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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. ?
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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 ...
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
en effet:

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

Daniel
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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,  @+
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
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
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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, @+
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
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]