| var for next | |
|
+5Jean Claude JL35 jjn4 lodchjo loulou08 9 participants |
Auteur | Message |
---|
loulou08
Nombre de messages : 63 Age : 81 Localisation : Champagne-Ardenne Date d'inscription : 16/05/2010
| Sujet: var for next Mer 15 Fév 2012 - 12:39 | |
| Bonjour à tous Lancez le prog ci-dessous puis regardez
code dim i for i =1 to 5 print " i = ",i next i print "==après next i (i a +1)==" print " i = ", i," ???" print " i = ", i," ???" print "Pourquoi "
Merci d'avance
| |
|
| |
lodchjo
Nombre de messages : 162 Age : 53 Localisation : Anvers Date d'inscription : 26/12/2011
| Sujet: Re: var for next Mer 15 Fév 2012 - 12:48 | |
| Hou, très bonne observation!!!! Ma théorie: je crois que Jack, pendant le développement de Panoramic Basic, a programmé les instructions FOR NEXT comme une instruction REPEAT - UNTIL. Notamment, on pourrait remplacer - Code:
-
FOR X = a TO b STEP c REM instructions NEXT par - Code:
-
x=a REPEAT REM instructions x=x+c UNTIL X>b (REM ou bien: UNTIL X=b+c ou quelque chose comme ça.)
En applicant ceci a ton example, sa donne: - Code:
-
dim i i=1 REPEAT print "i=",i i=i+1 UNTIL i=5+1 print "--------" print "a la fin" print "--------" print "i=",i
Dernière édition par lodchjo le Mer 15 Fév 2012 - 12:52, édité 1 fois | |
|
| |
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Mer 15 Fév 2012 - 12:50 | |
| Explique plutôt plus en détail où tu trouves qu'il y a un problème. Pensais-tu que la variable continuerait à incrémenter après next ? Ah, et sers-toi du bouton code (13° à partir de la gauche) pour ouvrir puis refermer une fenêtre de code. A+ on s'est croisé avec lodchjo : que la variable atteigne 6 après le dernier next est normal et qu'elle ne bouge plus ensuite aussi. | |
|
| |
lodchjo
Nombre de messages : 162 Age : 53 Localisation : Anvers Date d'inscription : 26/12/2011
| Sujet: Re: var for next Mer 15 Fév 2012 - 12:55 | |
| - jjn4 a écrit:
- Explique plutôt plus en détail où tu trouves qu'il y a un problème.
C'est pas vraiment une problème, mais une bizarrerie, que - Citation :
- FOR i = 1 to 5
a comme résultat i=6. ET, si, ça peut être une problème, quand on est en train de programmer un truc et tu suppose que i=5, mais en faite, on dois constater que i=6... | |
|
| |
lodchjo
Nombre de messages : 162 Age : 53 Localisation : Anvers Date d'inscription : 26/12/2011
| Sujet: Re: var for next Mer 15 Fév 2012 - 13:03 | |
| jjn4, tu as raison: dans la documentation de panoramic, il y a écrit que le boucle "FOR V=S TO E" s'arrete, quand le variable V est plus grand que E. Dans cet example, FOR i=1 TO 5, le boucle s'arrete quand i=6 (mais les instructions ne sont pas executés pendant ce dernier tour) | |
|
| |
loulou08
Nombre de messages : 63 Age : 81 Localisation : Champagne-Ardenne Date d'inscription : 16/05/2010
| Sujet: Re: var for next Mer 15 Fév 2012 - 13:29 | |
| Dans les autres basic la boucle "FOR V=S TO E" s'arrete, quand le variable V est = E.
ok merci | |
|
| |
lodchjo
Nombre de messages : 162 Age : 53 Localisation : Anvers Date d'inscription : 26/12/2011
| Sujet: Re: var for next Mer 15 Fév 2012 - 13:43 | |
| ouais, c'est ce que j'avais attendu de panoramic moi aussi! enfin, maintenant que l'on sait, on peut faire attention a ça | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: var for next Mer 15 Fév 2012 - 14:36 | |
| Il me semble bien quand même que dans les autres basics (comme dans Panoramic) la boucle s'arrête quand V est égale à E, mais à la sortie la variable V est égale à E+1, donc rien de nouveau. | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: var for next Mer 15 Fév 2012 - 16:40 | |
| Salut à tous, Pour Loulou08, tu peux toujours demander de sortir de la boucle au bon moment. - Code:
-
dim i% for i% = 1 to 5 if i%=5 then exit_for next i% print i%
C'est vrai que EXIT_FOR n'est pas dans la la rubrique "EN RAPPORT" du manuel. A+ | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: var for next Mer 15 Fév 2012 - 16:50 | |
| C'est quand même bien utile que ce soit comme ça: FOR i% = 1 TO 6 IF i% = a THEN EXIT_FOR NEXT i% IF i% > 6 -> a est en dehors des valeurs testées enfin, c'est comme ça que je l'ai toujours utilisé. | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: var for next Mer 15 Fév 2012 - 17:07 | |
| Bonsoir, Tout d'abord, bienvenu à loulou08 !! Dans une boucle for : l'incrémentation de l'indice se fait en fin de boucle alors que le test lui est réalisé en début... Donc on incrémente, on revient en début de boucle et le test nous fait sortir... ce qui explique que tu te retrouve avec 6... C'est également vrai en langage C | |
|
| |
loulou08
Nombre de messages : 63 Age : 81 Localisation : Champagne-Ardenne Date d'inscription : 16/05/2010
| Sujet: Re: var for next Mer 15 Fév 2012 - 17:10 | |
| solution for i=1 to 5 print i next i :i=i-1 print i
ok @+ Merci | |
|
| |
loulou08
Nombre de messages : 63 Age : 81 Localisation : Champagne-Ardenne Date d'inscription : 16/05/2010
| Sujet: Re: var for next Mer 15 Fév 2012 - 17:41 | |
| Merci pour votre accueil NARDO26 | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: var for next Mer 15 Fév 2012 - 17:44 | |
| Ca marche à condition de ne pas avoir de pas (step ou de modification de i dans la boucle de traitement ...) Soit directement dans le code voir pire, si tu utilise i dans une procédure évenementielle par exemple ... Perso, je pense qu'il est plus sûr dans ce cas de blinder ton source par: for i=1 to 5 ... next i :i=5 au moins tu es sûr de ta valeur finale En tout cas bienvenu dans le club ^^ | |
|
| |
loulou08
Nombre de messages : 63 Age : 81 Localisation : Champagne-Ardenne Date d'inscription : 16/05/2010
| Sujet: Re: var for next Mer 15 Fév 2012 - 18:13 | |
| Jicehel merci pour la bienvenue | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: var for next Jeu 16 Fév 2012 - 9:09 | |
| - Nardo26 a écrit:
Donc on incrémente, on revient en début de boucle et le test nous fait sortir... ce qui explique que tu te retrouve avec 6... C'est également vrai en langage C
C'est vrai aussi avec FreeBASIC et Delphi (je viens de tester). Toutefois, avec Delphi, lors de la compilation, on obtient un avertissement disant que la variable peut être indéfinie après la boucle. En revanche, avec FreePascal on obtient 5. La plus grande prudence s'impose donc ! D'une manière générale, il vaut mieux éviter d'utiliser une variable de boucle en-dehors de la boucle. Si on a encore besoin de la variable il vaut mieux recourir aux structures WHILE ... END_WHILE ou REPEAT ... UNTIL. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: var for next Jeu 16 Fév 2012 - 18:37 | |
| Parfaitement d'accord, Jean_debord ! Une variable de boucle ne devrait pas servir en-dehors de la boucle sans réinitialisation.
Si l'on sort de la boucle par EXIT_FOR, la variable de boucle a une valeur quelconque, et on ne peut pas savoir, en-dehors de la boucle, si tout le traitement pour cet indice a été effectué ou une partie seulement. Si je veux sortir une valeur précise de l'indexe en-dehors de la boucle, j'en affecte la valeur à une autre variable juste avant de faire EXIT_FOR.
| |
|
| |
loulou08
Nombre de messages : 63 Age : 81 Localisation : Champagne-Ardenne Date d'inscription : 16/05/2010
| Sujet: RESOLU Jeu 16 Fév 2012 - 19:09 | |
| Je ne m’était pas rendu contre jusque a présent , C’est après ce petit test que cela ma surpris c’est juste bon a savoir je vous remercie tous de vos conseils | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: var for next Jeu 16 Fév 2012 - 19:55 | |
| @Klaus, - Citation :
Si l'on sort de la boucle par EXIT_FOR, la variable de boucle a une valeur quelconque, et on ne peut pas savoir, en-dehors de la boucle, si tout le traitement pour cet indice a été effectué ou une partie seulement.
tu m'inquiètes car si ce que tu dis est vrai, je fais constamment des erreurs dans mes codes. Pour moi, quand on sort par exit_for on n'a éffectivemment pas terminé la boucle et la valeur de i% est forcément la dernière "connu" vu que l'on sort de la boucle. Je remet mon code: - Code:
-
dim i%,a$ for i% = 1 to 5 if i%=5 then a$=str$(i%):exit_for next i% print i% print a$ A+ | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: var for next Jeu 16 Fév 2012 - 21:07 | |
| Tas raison, Jl35, si tu dis que la variable de boucle a forcément la dernière valeur connue dans la boucle. Mis qu'est-ce que cela veut dire ? Seulement qu'on était "quelque part" dans l'itération uméro untel ! Cela ne détermine en aucun cas jusqu'où l'intérieur de la boucle a été effectué. Exemple: - Code:
-
for i%=1 to 10 file_writeln 1,table1$(i%) file_writeln 1,table2$(i%) if flag%=1 then exit_for file_writeln 1,table3$(i%) file_writeln 1,table4$(i%) if flag%=1 then exit_for file_writeln 1,table5$(i%) file_writeln 1,table6$(i%) next i% if i%<10 then goto boucle_interrumpue ... boucle_interrompue: : ' interrompue, certes, mais qu'est-ce qui a été écrit dans le fichier ?
Bon, j'en conviens, mon programme est un peu bêta. Mais c'est fait exprès: il faut imaginer que la variable flag% est positionnée à 0 sur le clic d'un bouton d'abandon, par exemple.. Dès lors que EXIT_FOR n'est pas placé, soit comme première, soit comme dernière instruction de la boucle, on est dans l'incertitude sur les parties exécutées ou non exécutées de la boucle. Et ce indépendamment de la valeur, sûre ou non, de la variable de boucle. C'est pourquoi je code systématiquement un cas comme ci-dessus, de la manière suivante: - Code:
-
sortie% = 0 for i%=1 to 10 file_writeln 1,table1$(i%) file_writeln 1,table2$(i%) if flag%=1 sortie% = 1 i_sortie% = i% exit_for end_if file_writeln 1,table3$(i%) file_writeln 1,table4$(i%) if flag%=1 sortie% = 2 i_sortie% = i% exit_for end_if file_writeln 1,table5$(i%) file_writeln 1,table6$(i%) next i% if sortie%>0 then goto boucle_interrumpue ... boucle_interrompue: : ' ici, on sait à quel moment on est sorti et on connaît la valeur de i%
| |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: var for next Ven 17 Fév 2012 - 1:25 | |
| C'était Jean-Claude, mais c'est pareil. Quand même, moi je fais constamment des boucles du genre (par exemple pour un container_option avec des options de 10 à 15): - Code:
-
for i% = 10 to 15 if checked(i%) = 1 then exit_for next i% en sortie j'ai bien dans i% l'option qui est cliquée ! dans tous les cas j'ai bien dans i% la valeur qu'il avait au moment de l'exit_for. Dans tous les cas la variable de boucle a en sortie la valeur limite +1 (boucle complète), soit sa valeur au moment de l'exit_for, je ne vois pas où est le problème. | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: var for next Ven 17 Fév 2012 - 8:36 | |
| Merci à tous les deux pour vos réponses, @Klaus, J'ai bien du mal à suivre ton explication, mais je vais utiliser ta démonstration en enregistrant les valeurs dans un fichier. J'ai refait un petit code qui montre la différence si tu incrémentes une variable avant ou après EXIT_FOR. Rien de révélateur, tout ce passe comme je l'entendais jusqu'à présent. - Code:
-
dim n%,a,b alpha 1:top 1,50:left 1,50:font_size 1,14 alpha 2:top 2,90:left 2,50:font_size 2,14 alpha 3:top 3,130:left 3,50:font_size 3,14
for n%=1 to 10 a=a+1 ' if n%=5 then exit_for if n%>5 then exit_for b=b+1 next n%
caption 1,"sortie par Exit_for n%="+str$(n%) caption 2,"sortie par Exit_for a="+str$(a) caption 3,"sortie par Exit_for b="+str$(b)
Merci, A+ | |
|
| |
Contenu sponsorisé
| Sujet: Re: var for next | |
| |
|
| |
| var for next | |
|