Page 1 sur 1

portées des variables et passage par référence

Posté : dim. 16 sept. 2018 16:40
par sleinininono
Bonjour!

venant de C++, je ne suis pas habituée à des langages aussi permissif, et n'étant pas très bonne en programmation, j'ai du mal à discerner ce que je peux ou ne peux pas faire.

J'aurais aimé écrire une function pour l'associé à un bouton. Dans la fonction j'appelle une autre fonction. Appelons les respectivement 1 et 2.
En dehors de 1, je mets des variables globales utilisées dans 1. Si je les modifies dedans, elles le seront aussi à l'extérieur, c'est bien ça?
Par contre, dans 1 je mets de nouvelles variables locales. Là, elles seront modifées dans 2. Mais est ce que la modification va rester dans le contexte de la function 1? Il y a t-il des conditions pour que ça le soit ? Par ce que pour l'instant j'ai juste écrit :
function2( $nb_de_points_int, $case ).

Merci pour m'éclairer!

Re: portées des variables et passage par référence

Posté : dim. 16 sept. 2018 17:40
par jchd
Il n'y a que deux portées en AutoIt : locale (à une fonction) et globale (tout le script). Il n'y a ni portée de bloc ni portée d'include.
Des variables locale à la fonction A qui fait appel à la fonction B (sans les passer en argument) ne sont pas accessibles dans B. Si l'on souhaite que ces variables soient utilisées par B il faut les lui transmettre, par copie ou par référence (ByRef).
Global $PI = ACos(-1)      ; accessible partout à partir de ce point

_main()

Func _main()
   MsgBox(0, "", "π ≈ " & $PI)
   Local $E = Exp(1)    ; accessible dans _main
   MsgBox(0, "", "e ≈ " & $E)
   _e_pow_Pi($E)        ; on passe l'argument, inaccessible depuis _e_pow_pi, ici par référence
   _is_Pi_pow_X_transcendant($E) ; idem mais passage par copie
EndFunc

Func _e_pow_Pi(ByRef $real)
   MsgBox(0, "", "e^π ≈ " & $real ^ $PI)
EndFunc

Func _is_Pi_pow_X_transcendant($X)
   MsgBox(0, "", "π^e ≈ " & $PI ^ $X)
   ;
   ; test pour déterminer si π ^ $X est transcendant (laissé en exercice)
   ;
EndFunc

Re: portées des variables et passage par référence

Posté : dim. 16 sept. 2018 17:48
par sleinininono
merci pour la réponse!

Elle m'a l'air claire, mais je ne suis pas assez forte et spécialiste pour être sûre d'avoir tout compris...

Donc il y a deux portés, ok.
Mais donc, dans l'exemple, les functions d'exponentiations ne peuvent accéder à $E que parce qu'on lui donne dans les arguments de la fonction, c'est ça? Et est ce que dans les deux cas, si on modifie $E dans les fonctions pow, c'est bien $E qui est modifié ?
Autrement dit, est ce que rajouter le ByRef change quelque chose?


Désolé de demander, mais je ne sais pas du tout comment vérifier. Auto-it ne m'est absolument pas naturel pour pouvoir tester des choses, comme peuvent l'être d'autres compilateur.

Re: portées des variables et passage par référence

Posté : dim. 16 sept. 2018 23:07
par Tlem
Bonsoir Crystal.
En réponse à votre présentation, je vous ai indiqué la manière d'écrire "AutoIt". Merci d'éditer et de corriger les messages non conformes.

Envoyé de mon Smartphone en utilisant Tapatalk

Re: portées des variables et passage par référence

Posté : lun. 17 sept. 2018 00:19
par jchd
C'est exactement comme en C++ : quand on passe la copie d'une variable, modifier la copie n'affecte bien sûr pas la variable mère. Quand on passe une référence à une variable, la modifier par référence change obligatoirement la variable (la seule existante).
La vérification est immédiate : il suffit d'essayer !

Le terme compilateur est abusif ; il s'agit d'un simple interpréteur. Et je ne saurais dire si C++ est plus "naturel" qu'AutoIt ou inversement, même si j'ai quand même ma petite idée.

Re: portées des variables et passage par référence

Posté : lun. 17 sept. 2018 01:51
par walkson
Bonjour,
même si j'ai quand même ma petite idée.
Et j’aimerais connaitre votre "petite idée" si je puisse me permettre....

Re: portées des variables et passage par référence

Posté : lun. 17 sept. 2018 13:00
par jchd
Si "naturel" signifie "abordable par un néophyte" alors AutoIt l'est considérablement plus que bien des langages plus répandus.
La notion de "naturel" pour un langage artificiel est très subjective et les avis peuvent diverger selon le contexte dans lequel les personnes se trouvent, leurs besoins et l'expérience dont elles disposent.

Re: portées des variables et passage par référence

Posté : mar. 18 sept. 2018 05:17
par mdanielm
Après avoir pris de bonnes habitudes de programmation en C++, je ne vois pas l'intérêt de les perdre pour utiliser à tout prix la "permissivité" d'Autoit. Ce n'est pas une obligation.

Exemple:
De nombreux exemples de la documentation utilisaient l'instruction:

If _WinAPI_GetVersion() < 6.0 Then Exit ...

et il a fallu un certain temps avant que les auteurs se rendent compte que la permissivité d'AutoIt, ici la comparaison d'une chaîne avec un nombre, est dangereuse (tester avec Windows 10), pas nécessairement à l'instant où on programme mais plusieurs années après!

Re: portées des variables et passage par référence

Posté : jeu. 20 sept. 2018 12:25
par jpascal
Sinon il y a aussi les variables Local Static. ;-)

Re: portées des variables et passage par référence

Posté : jeu. 20 sept. 2018 21:43
par jchd
Le modificateur Static n'indique pas une portée mais empêche la réinitialisation d'une variable (locale) dans une fonction.

Re: portées des variables et passage par référence

Posté : lun. 24 sept. 2018 17:44
par mdanielm
De nombreux exemples de la doc utilisent Local et Global dans le corps principal du programme, genre:
Global $g_iVar1 = 2
Local $iVar2 = 3
ConsoleWrite($iVar2 & @crlf)
f()

func f()
   msgbox(0,"",$g_iVar1)
EndFunc
Je pense qu'ils veulent faire la différence entre une variable qui sera utilisée uniquement dans le corps du programme (Local) et une variable qui sera utilisée aussi dans les fonctions (Global).

Re: portées des variables et passage par référence

Posté : lun. 24 sept. 2018 18:35
par jchd
On peut faire ça.
Perso j'aime bien la convention suivante pour la portée des variables, avec une sémantique légèrement différente :
Global (en dehors d'une fonction) = vraiment globale, donc accessible partout après sa définition
Local en dehors d'une fonction = n'a pas vocation a être accédée ailleurs que dans le fichier source où elle figure (comme en C). C'est la portée "fichier" du pauvre.

Global dans une fonction = NO-NO, nein, interdit, forbidden, nada, verbotten, caca dégueu.

Pour ce qui est de Dim, cette syntaxe ne devrait avoir qu'une seule utilisation : lorsqu'on passe une variable ByRef à une fonction et qu'on doit la redéfinir pour en faire une array, typiquement pour y stocker un résultat sans création d'une variable intermédiaire et copie. Pour moi tout autre emploi est proscrit.