[R] Boucle, variable globale et fonction

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] Boucle, variable globale et fonction

#1

Message par jpascal »

Bonjour,

A la suite de la modification d'un de mes scripts, j'ai obtenu une erreur. J'ai mis du temps à trouver la cause.

Pour faire simple, j'ai créé ce script qui expliquera facilement la problématique :

Code : Tout sélectionner

Global $g_iValue = 9

For $g_iValue = 0 To 3
	Test()
Next
ConsoleWrite('- ')
For $g_iValue = 0 To 3
	Test()
Next
ConsoleWrite('- ')
Boucle()
ConsoleWrite(@CRLF)

Func Boucle()
	For $g_iValue = 0 To 3
		Test()
	Next
EndFunc   ;==>Boucle

Func Test()
	ConsoleWrite($g_iValue & ' ')
EndFunc
Le résultat obtenu n'est pas 0 1 2 3 - 0 1 2 3 - 0 1 2 3 mais 0 1 2 3 - 0 1 2 3 - 4 4 4 4

Auriez-vous une explication ou est-ce un bogue ?
Modifié en dernier par jpascal le mer. 24 oct. 2018 09:39, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Boucle, variable globale et fonction

#2

Message par orax »

Sur la page For...To...Step...Next de la documentation, il est écrit : « La variable sera créée automatiquement en portée "Local", même si MustDeclareVars est actif. ». Selon moi, l'explication vient de là.

Code : Tout sélectionner

Global $g_iValue = 9
ConsoleWrite($g_iValue & @CRLF) ; 9
test()
Func test()
	Local $g_iValue = 123
	ConsoleWrite($g_iValue & @CRLF) ; 123
EndFunc   ;==>test
ConsoleWrite($g_iValue & @CRLF) ; 9
Dans cet exemple, le script affiche 9 - 123 - 9. La variable $g_iValue est locale dans la fonction test() donc, dans cette fonction, elle n'est pas modifiée globalement. Je crois comprendre qu'il se produit quelque chose de similaire avec For.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Boucle, variable globale et fonction

#3

Message par Tlem »

Pour éviter ce genre de déboire, pourquoi ne passez-vous pas la valeur $g_iValue à la fonction Test() ?
Global $g_iValue

For $g_iValue = 0 To 3
   Test($g_iValue)
Next
ConsoleWrite('- ')

For $g_iValue = 0 To 3
   Test($g_iValue)
Next
ConsoleWrite('- ')
Boucle()
ConsoleWrite(@CRLF)

Func Boucle()
   For $g_iValue = 0 To 3
      Test($g_iValue)
   Next
EndFunc   ;==>Boucle

Func Test($iValue)
   ConsoleWrite($iValue & ' ')
EndFunc
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Boucle, variable globale et fonction

#4

Message par jpascal »

Bonjour et merci pour vos réponses.

Je suis passé à côté de l'information sur la portée locale dans l'aide. Désolé.

Cela n'explique toutefois pas pourquoi la valeur de $g_iValue a été modifiée de 3 à 4.

Pour ce qui est de passer la variable en paramètre, j'avoue préférer sans. Ainsi, lorsqu'une variable globale est utilisée dans plusieurs "sous"-fonctions, j'ai le même nom de variable dans tout mon script.
Je pourrais aussi écrire Func fonction($g_iValue) mais il faut que je pense à bien utiliser le nom de la variable globale en paramètre.

Une autre explication est que mes "sous"-fonctions utilisent déjà un ou plusieurs paramètres. En utilisant la variable globale, je n'ai pas à me soucier de la "place" dans les paramètres (Func fonction($param1, $param2, $g_iValue))
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre