Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Erreur: Variable Already Used... | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Erreur: Variable Already Used... Jeu 24 Avr 2008 - 18:21 | |
| Que signifie l'erreur suivante: Variable Already Used In An External Loop. Line: 77 obtenue dans un sous-programme qui contient une boucle: 77 FOR im = 1 TO totv ... NEXT im ? | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Erreur: Variable Already Used... Jeu 24 Avr 2008 - 18:52 | |
| Cela veut dire qu'une boucle externe utilise la même variable im, et que la boucle interne, celle qui est décrite à la ligne 77, peut modifier la variable utilisée dans la boucle externe, ce qui à priori, peut causer des problèmes. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Erreur: Variable Already Used... Ven 25 Avr 2008 - 10:05 | |
| C'est ce que j'avais bien cru comprendre, mais le problème est que j'obtiens cette erreur dans un sous-programme qui ne contient que cette boucle (et la variable im n'est utilisée qu'ici, totv étant une constante définie plus haut: nombre total de vignettes affichées). Extrait: - Code:
-
......... rem fin du programme principal END
rem ***************** rem ************** SOUS-PROGRAMMES *************** rem *****************
Affi: REM affichage en grand de la vignette cliquée FOR im = 1 TO totv IF CLICKED(im) = 1 REM vignette im cliquée, affichage de l'image j = 1 + INT((im - 1)/nbc): REM rangée i = im - (j - 1) * nbc: rREM colonne FILE_LOAD np, r$ + "\" + img$(j,i) STRETCH_ON np: REM ajustage de l'image à la fenêtre SHOW np GOTO reti END_IF NEXT im reti: RETURN Peut-être y a-t'il une anomalie dans la structure du code principal, je continue à chercher... En fait, le problème intervient à la deuxième exécution du sous-programme. Est-ce que le fait de sortir prématurément de la boucle par un GOTO (il n'y a pas d'EXIT FOR comme en Basic) au lieu du dernier NEXT ne poserait pas un problème (de compteur ou variable non réinitialisés, ou quelque chose comme ça) ? du fait que la boucle exécutée précédemment n'a pas été terminée naturellement elle est peut-être considérée comme étant toujours en cours d'exécution. C'est bien ce que je pensais: si je supprime le GOTO reti dans la boucle et que je termine son exécution (pour rien, mais bon...), tout se passe très bien et il n'y a plus d'erreur. CQFD. Remarque subsidiaire: c'est bien de donner le n° de la ligne fautive dans le message d'erreur, mais ce n'est pas évident à trouver du fait que les lignes ne sont pas numérotées, si le programme est long et s'il y a déjà eu plusieurs erreurs corrigées qui restent colorées en rouge. Ce serait bien d'avoir l'option numéros de lignes dans l'éditeur. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Erreur: Variable Already Used... Ven 25 Avr 2008 - 21:52 | |
| Dans une boucle, le test sur l'utilisation dans une boucle externe de la variable qui est utilisée a été mis pour éviter que la variable de la boucle externe puisse être manipulée. Je pensais que cela éviterait des erreurs de programmation, par exemple, utiliser plusieurs boucles FOR I=... imbriquées. Si cela devient gênant, le test peut être retiré. Libre au programmeur de savoir ce qu'il fait. Je vais examiner en détail ton exemple. Je vais réfléchir à une possibilité d'indiquer les numéros de lignes. - Citation :
- s'il y a déjà eu plusieurs erreurs corrigées qui restent colorées en rouge
Il y a un bouton qui permet de refaire la coloration syntaxique dans ce cas. Mais si c'était automatique, ce serait mieux. Je vais regarder cela aussi.
Dernière édition par panoramic le Sam 26 Avr 2008 - 21:15, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Erreur: Variable Already Used... Ven 25 Avr 2008 - 22:27 | |
| Je ne conteste pas l'utilité d'un test pour vérifier l'intégrité d'une variable de boucle, mais dans mon cas (reexécution d'une boucle après sortie prématurée la fois précédente) ça ne se justifie pas. Il me semble qu'il vaudrait mieux une fonction EXIT FOR qui ôterait cette variable des boucles en cours d'exécution. Dans mon exemple ci-dessus, si au lieu de: - Code:
-
GOTO reti je mettais - Code:
-
im = totv pour provoquer la sortie immédiate de la boucle, est-ce que ce serait licite ? (je ne suis pas sûr qu'il soit bien sain de manipuler le compteur de boucle). PS je viens d'essayer, ça marche très bien ! Pour la coloration syntaxique, je suis bête, je n'avais pas percuté, pour refaire la coloration j'enregistrais le programme après modifs et je le rechargeais... alors que j'avais un bouton pour faire ça tout seul... Je me coucherai un peu moins bête ce soir. Merci pour ta réponse. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Erreur: Variable Already Used... Sam 26 Avr 2008 - 21:14 | |
| Après examen du problème que tu soulèves, il s'avère que c'est le fait de sortir d'une boucle par un goto qui n'est pas accepté lors de l'exécution d'une nouvelle boucle avec la même variable. Ton problème est isolé dans l'exemple suivant, qui déclenche une erreur: - Code:
-
dim i% label sortie
for i%=1 to 3 print i% if i%=2 then goto sortie next i%
sortie:
for i%=1 to 3 print i% next i%
Comme la première boucle n'est pas "close", PANORAMIC considère lorsqu'il commence à exécuter la seconde boucle avec la même variable, que cette variable n'a pas été "libérée" et déclare une erreur. Ce comportement n'est pas normal, on doit pouvoir sortir d'une boucle par un GOTO. Pour le moment, le contournement que je vois est d'utiliser une deuxième variable pour la seconde boucle. Ce code fonctionne: - Code:
-
dim i%,j% label sortie
for i%=1 to 3 print i% if i%=2 then goto sortie next i%
sortie:
for j%=1 to 3 print j% next j%
Mais malheureusement, le code suivant ne fonctionne pas, et pour la même raison: - Code:
-
dim i%,j% label sortie,recommence
recommence: for i%=1 to 3 print i% if i%=2 then goto sortie next i%
sortie:
for j%=1 to 3 print j% next j%
goto recommence
En effet, lors du retour à la boucle for i% - - - PANORAMIC considère que la boucle for i% du cycle précédent n'a jamais été terminée, et déclenche une erreur. Je vais revoir tout cela et regarder la possibilité des 3 commandes: EXIT_FOR, EXIT_WHILE, EXIT_REPEAT pour sortir d'une boucle sans avoir besoin de faire un GOTO sur un label qu'il faut obligatoirement avoir déclaré au préalable. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Erreur: Variable Already Used... Sam 26 Avr 2008 - 21:52 | |
| Effectivement, ce serait bien (ça existe en Basic et je m'en servais souvent, et ça économiserait un label). En attendant, il semble que si on positionne la variable boucle à sa valeur finale (i% = 3 dans ton exemple) et qu'on branche sur une étiquette juste avant le next, on sort tout de suite de la boucle, et proprement. C'est ce que je fais en attendant mieux. L'inconvénient de cette méthode, c'est que dans ce cas on perd la valeur de la variable boucle qui fait sortir, qui peut être utile à connaître dans certains cas. Par exemple (recherche du caractère "\" dans une chaîne): - Code:
-
FOR i% = 1 TO LEN(a$) IF MID$(a$, i%, 1) = "\" ... sortie avec la valeur de i% exploitée ensuite END_IF NEXT i% là on est coincé. Incidemment, il manque la fonction INSTR du Basic de recherche d'un caractère dans une chaîne: k = INSTR(a$, car$), ce qui éviterait une boucle avec sortie de boucle si caractère trouvé. | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: erreur sur variable Lun 15 Juin 2009 - 20:37 | |
| Salut JL35 je te propose ce code qui je pense peut résoudre ton problème en l'adaptant. - Code:
-
dim i%,carac% while i%<>3 i%=i%+1 print "i%=" : print i% end_while print "sortie " : print i% if i%=3 then carac% = i% print print " --------------------- " print for i%=1 to 5 print "i%2 =" : print i% next i% print print " --------------------- " print print "le caractère sauvegardé : " : print carac% end
La première boucle peut être sortie prématurément sans altérer la variable. Au passage la variable i% est sauvegardée dans la constante carac%. tu peux adpter cette méthode à des chaines de caractères. georges | |
| | | Contenu sponsorisé
| Sujet: Re: Erreur: Variable Already Used... | |
| |
| | | | Erreur: Variable Already Used... | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |