Page 1 sur 1

[R] Boucle, variable globale et fonction

Posté : mar. 23 oct. 2018 13:55
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 ?

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

Posté : mar. 23 oct. 2018 14:20
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.

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

Posté : mar. 23 oct. 2018 21:46
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

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

Posté : mer. 24 oct. 2018 08:38
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))