For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message par boddhi »

Pardon Falsam de t'avoir piqué la référence :wink:

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 :
Image

Le même code et le résultat en mode exécution sans débogage :
Image

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.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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 :
Image
 
Avec le IF :
Image

La même portion de code avec une boucle While...Wend en lieu et place de la boucle For...Next
Image

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...
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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 🤪🙃🤣
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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)
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message par boddhi »

@falsam
Toi, au moins, t'as trouvé un "psy" ! :wink: :mrgreen:
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 ! :lol: :wink:
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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 ! 🥰

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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 ! :wink: :)

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 !!!!
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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 !!!!

:) :wink:
Fanator
Messages : 20
Inscription : jeu. 19/avr./2007 8:14

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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 ?
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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..
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: For...Next (De quoi devenir dingue aussi !!! 😖 😁)

Message 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

Code : Tout sélectionner

"compteur.co\val  = i
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 ?
Répondre