Page 1 sur 2
For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : sam. 08/avr./2023 23:53
par boddhi
Pardon Falsam de t'avoir piqué la référence
Mais moi aussi, je commence à devenir dingue !
Ca fait deux jours que je teste un bout de code qui fonctionne correctement puis ne fonctionne plus correctement !
Jusqu'à ce que je me rende compte, après avoir viré et/ou commenté une partie du code, qu'il s'exécute différemment selon qu'il est lancé avec ou sans mode débogage.
Le code et le résultat en mode exécution avec débogage :
Le même code et le résultat en mode exécution sans débogage :
Dans le premier cas, la boucle avec incrémentation négative est correcte alors que, dans le second, le 2 est systématiquement et toujours sauté !
Rien dans le code intermédiaire ne modifie la valeur de Compteur !
Pourquoi ce foutu For...Next ne me retourne pas alors le résultat attendu ?
Si quelqu'un a une idée ?
Merci d'avance.
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : dim. 09/avr./2023 7:08
par kernadec
bjr boddhi
mettre un SetGadgetState(0, 0)
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 270, 180, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ComboBoxGadget(0, 10, 10, 250, 21, #PB_ComboBox_Editable)
For compteur = 4 To 1 Step-1
AddGadgetItem(0, -1, "compteur : " + Str(compteur))
Debug compteur
Next compteur
SetGadgetState(0, 0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
cordialement
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : dim. 09/avr./2023 10:24
par boddhi
Merci Kernadec pour ta proposition mais cela ne résout pas le problème.
Entre-temps, par dépit, je me suis rabattu sur une boucle While...Wend qui, elle, fonctionne parfaitement.
Toutefois, ton code m'a orienté sur la possibilité que l'absence du nom de variable après le Next en soit à l'origine.
(Ca fait tellement longtemps que j'ai perdu l'habitude de saisir ainsi que j'avais omis la probabilité que cela puisse venir de là)
J'ai testé mais, hélas, même résultat !
C'est finalement le second If...Endif qui provoque ce bogue :
Sans le IF :
Avec le IF :
La même portion de code avec une boucle While...Wend en lieu et place de la boucle For...Next
C'est qd même rageant de ne pas comprendre pourquoi ce If vient f***** le bordel !!!
Surtout que je n'arrive pas à reproduire ce phénomène en extrayant cette portion pour l'exécuter toute seule dans un nouvel onglet de code...
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : dim. 09/avr./2023 14:15
par falsam
boddhi a écrit : sam. 08/avr./2023 23:53
Pardon Falsam de t'avoir piqué la référence
Ca fait du bien de ne plus être tout seul à souffrir de cette dingoserie



Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : dim. 09/avr./2023 16:21
par Marc56
Un fragment de code et en plus en copie écran ça ne nous incite pas à tester (pas envie de retaper)
L'erreur classique du code qui marche différemment avec ou sans Debug c'est souvent une instruction derrière un Debug, donc ignorée ensuite
Parfois on met plusieurs instructions sur une seule ligne et on oublie un : Debug hors écran
L'autre façon de faire est de mettre les lignes en commentaire une par une et pas par bloc, jusqu'à trouver l'erreur
Ne pas oublier l'indispensable EnableExplicit (une simple faute de frappe 1, l 8, B etc et c'est des jours perdus)
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : dim. 09/avr./2023 23:14
par boddhi
@falsam
Toi, au moins, t'as trouvé un "psy" !
Marc56 a écrit :
Un fragment de code et en plus en copie écran ça ne nous incite pas à tester (pas envie de retaper)
C'est vrai. Dans mon esprit, je n'attendais pas vraiment une solution (je l'avais déjà via la boucle While...Wend) mais juste savoir si quelqu'un avait déjà constaté le phénomène avec une boucle For...Next avec décrémentation...
Si tu veux tester, le code complet est
ici et la portion du source est située entre les lignes 683 et 701 de la version 1.10 (Il suffit de remplacer la boucle While...Wend par un For...Next et virer la décrémentation "Compteur-1")
L'erreur classique du code qui marche différemment avec ou sans Debug c'est souvent une instruction derrière un Debug, donc ignorée ensuite
Parfois on met plusieurs instructions sur une seule ligne et on oublie un : Debug hors écran
L'autre façon de faire est de mettre les lignes en commentaire une par une et pas par bloc, jusqu'à trouver l'erreur
Rien de tout ça dans mon code.
Aucun debug entre les lignes de code.
Et les impressions-écran fournies étaient l'exact reflet du code au moment des exécutions et elles montrent bien par ailleurs la mise en commentaires des lignes pour déterminer d'où pouvait venir le problème...
Ne pas oublier l'indispensable EnableExplicit (une simple faute de frappe 1, l 8, B etc et c'est des jours perdus)
Cela fait bien 18-19 ans que j'utilise PB et je peux t'assurer que la première ligne de code que je frappe toujours dans un programme, c'est bien un EnableExplicit.
Je l'ai appris à mes dépens très très vite !

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 2:29
par SPH
Je n'aime pas perturber une boucle For Next.
Par contre, une boucle While Wend ou Repeat Until/Forever (avec mon ami 'Goto'), ouai !

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 9:26
par Ar-S
Dans les bizarreries de boucles, je ne vois pas pourquoi la seconde boucle n'affiche que la valeur 4 avec un ForEach ni pourquoi la 3eme en se basant sur les index (boucle for L) n'affiche que 4
Code : Tout sélectionner
Structure co
val.i
EndStructure
Global NewList compteur.i()
For i = 1 To 4
AddElement(compteur())
compteur.co\val = i
Debug "Index : " + ListIndex(compteur())
Debug "Valeur : " + compteur.co\val
Next
; NOK
Debug ".............."
ForEach compteur()
Debug "compteur : " + compteur\Val
Next compteur()
;NOK
Debug ".............."
For L = 0 To 3
SelectElement(compteur(),L)
Debug "compteur : " + compteur\Val
Next
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 12:19
par boddhi
Ar-S a écrit :
For i = 1 To 4
AddElement(compteur())
compteur.co\val = i
Debug "Index : " + ListIndex(compteur())
Debug "Valeur : " + compteur.co\val ; => Pourquoi compteur.co\val et pas compteur()
Next
Pourquoi compteur.co\val et pas compteur()
La variable compteur.co\val a pour dernière affectation 4 et n'est pas modifiée ensuite, non ?
SPH a écrit :
Je n'aime pas perturber une boucle For Next.
Pourquoi un If...Endif perturberait un For...Next ?
Dans ce cas-là, il ne faudra mettre aucune instruction à l'intérieur pour être sûr que rien ne vienne perturber la boucle !
Et puis, à ce sujet, je n'ai jamais compris pourquoi PB n'autorise pas l'usage d'une variable avec le Step d'un For...Next.

C'est bien le seul langage où j'ai vu ça !!!
Même un BASIC sur ZX81 le permettait !!!!
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 14:45
par Marc56
For : Next avec Step à souvent donné des résultats bizarres (souvent discuté sur le forum us)
Ne pas se prendre la tête pendant deux jours, utiliser alors Repeat : Until ou While : Wend
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 15:39
par boddhi
Marc56 a écrit :
For : Next avec Step à souvent donné des résultats bizarres (souvent discuté sur le forum us)
Ne pas se prendre la tête pendant deux jours, utiliser alors Repeat : Until ou While : Wend
J'utilise très très rarement 'Step' mais, au final, c'est la conclusion à laquelle j'en suis venu !
FOR...STEP...NEXT : A BANNIR !!!!

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 15:56
par Fanator
Bonjour ! Voilà mes réponses... à ARS
Code : Tout sélectionner
; Version 1 : sans structure
NewList Compteur.i()
Debug " Mise en liste des valeurs "
For i= 0 To 4
AddElement(Compteur())
Compteur()=i
Debug "Index : " + ListIndex(Compteur())
Debug "Valeur : " + Compteur()
Next
Debug "---------------"
Debug "..ForEach....."
ForEach Compteur()
Debug "Index : " + ListIndex(Compteur())
Debug "Valeur : " + Compteur()
Next
Debug "---------------"
Debug "..For Next.."
For L = 0 To 3
SelectElement(Compteur(), L)
Debug "Valeur : " + Str(Compteur())
Next
Debug "========================================="
; Version 2 : Correction du programme avec Structure
Structure co
va.i
EndStructure
NewList Compteur2.co()
Debug " Mise en liste des valeurs "
For i = 0 To 4
*Element.co = AddElement(Compteur2())
If *Element <> 0
*Element\va = i
EndIf
Debug "Index : " + ListIndex(Compteur2.co())
Debug compteur2.co()\va
Next
Debug "----------------"
; OK
Debug "...For Next.."
For i = 0 To 2
SelectElement(compteur2.co(),i)
Debug "Index : " + ListIndex(Compteur2.co())
Debug compteur2.co()\va
Next
Debug "----------------"
; OK
Debug "..ForEach....."
ForEach compteur2.co()
Debug "Index : " + ListIndex(Compteur2.co())
Debug compteur2.co()\va
Next
Edit par TazNormand : j'ai viré les balises "SYNTAX" et mis des balises "CODE" car pour moi elle n'affichait pas le code, suis je le seul ?
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 21:35
par Ar-S
boddhi a écrit :Pourquoi compteur.co\val et pas compteur()
La variable compteur.co\val a pour dernière affectation 4 et n'est pas modifiée ensuite, non ?
Bah non, si je fais une structure avec une liste, c'est bien pour indexer des données différente à chaque index :
Code : Tout sélectionner
Structure co
val.i
n.s
EndStructure
Global NewList compteur.i()
For i = 1 To 4
AddElement(compteur())
compteur.co\val = i
compteur.co\n = "toto"+Str(i)
Debug "Index : " + ListIndex(compteur()) + " à la valeur " + Str(compteur.co\val) + " Nom : " + compteur.co\n
Next
On voit bien que mes 4 éléments de liste ont une valeur et un nom différents donc je ne pige pas en quoi un foreach ou autre n'afficheraient pas mes données indexées.
Ce n'est pas logique. A quoi sert un AddElement si les éléments structurés antérieurs se font écraser ?
@Fanator
Merci pour ces codes.
Il n'en demeure pas moins que je ne pige pas en quoi un pointeur est nécessaire..
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : lun. 10/avr./2023 22:32
par PAPIPP
Bonjour à tous
Je ne viens pas souvent ici
Mais je viens de voir ce qui vous chagrine
Il ne faut pas confondre variable et liste chainée comme le montre le prg suivant?
Code : Tout sélectionner
Structure co
val.i
EndStructure
Global NewList compteur.co()
For i = 1 To 4
AddElement(compteur())
compteur.co\val = i
compteur.co()\val = i
Debug "Index : " + ListIndex(compteur())
Debug "Valeur : " + compteur.co()\Val
Debug "Valeur var n'est pas une liste mais une variable :"+ compteur.co\Val
Next
; NOK
Debug ".............."
ForEach compteur.co()
Debug "compteur : " + compteur.co()\Val
Debug "Valeur var n'est pas une liste mais une variable :"+ compteur.co\Val
Next compteur()
;NOK
Debug ".............."
For L = 0 To 3
SelectElement(compteur.co(),L)
Debug "compteur : " + compteur.co()\Val
Debug "Valeur var n'est pas une liste mais une variable :"+ compteur.co\Val
Next
End
A+
Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)
Publié : mar. 11/avr./2023 7:31
par boddhi
Ar-S a écrit :
Bah non, si je fais une structure avec une liste, c'est bien pour indexer des données différente à chaque index :
Je ne sais pas si j'ai bien compris où tu voulais en venir avec ta démonstration et si je me suis bien exprimé dans ma réponse mais :
Code : Tout sélectionner
For i = 1 To 4
AddElement(compteur())
compteur.co\val = i
compteur.co()\val = i
Debug "Index : " + ListIndex(compteur())
Debug "Valeur : " + compteur.co()\Val
Debug "Valeur var n'est pas une liste mais une variable :"+ compteur.co\Val
Next
Ici
aura, au sortir de la boucle, la valeur 4.
Comme elle n'est pas modifiée sur le reste du code, la variable aura forcément toujours la même valeur dans ce qui suit :
Code : Tout sélectionner
; NOK
Debug ".............."
ForEach compteur()
Debug "compteur : " + compteur\Val
Next compteur()
;NOK
Debug ".............."
For L = 0 To 3
SelectElement(compteur(),L)
Debug "compteur : " + compteur\Val
Next
car jamais tes 'Debug'' ne font appel à la liste compte() mais toujours à 'compteur.co\Val' qui a sa valeur figée à 4.
C'est pourquoi, j'avais écrit
boddhi a écrit :Debug "Valeur : " + compteur.co\val ; => Pourquoi compteur.co\val et pas compteur()
Tu te déplaces bien dans les index de la liste avec ForEach ou SelectElement() mais jamais tu ne fais appel à la valeur indexée de la liste dans tes Debug...
Et si on remplace les 'compteur.co\val' dans ton code par des 'compteur()', cela semble avoir les résultats que tu escomptais :
Code : Tout sélectionner
Global NewList compteur.i()
For i = 1 To 4
AddElement(compteur())
compteur() = i
Debug "Index : " + ListIndex(compteur())
Debug "Valeur : " + compteur()
Next
; NOK
Debug ".............."
ForEach compteur()
Debug "compteur : " + compteur()
Next
;NOK
Debug ".............."
For L = 0 To 3
SelectElement(compteur(),L)
Debug "compteur : " + compteur()
Next
Me trompé-je ?