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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
sleinininono
Niveau 1
Niveau 1
Messages : 12
Enregistré le : jeu. 13 sept. 2018 12:54
Status : Hors ligne

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

#1

Message par sleinininono » dim. 16 sept. 2018 15:40

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!

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#2

Message par jchd » dim. 16 sept. 2018 16:40

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
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

sleinininono
Niveau 1
Niveau 1
Messages : 12
Enregistré le : jeu. 13 sept. 2018 12:54
Status : Hors ligne

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

#3

Message par sleinininono » dim. 16 sept. 2018 16:48

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.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11298
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

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

#4

Message par Tlem » dim. 16 sept. 2018 22:07

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
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é".

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#5

Message par jchd » dim. 16 sept. 2018 23:19

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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 582
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

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

#6

Message par walkson » lun. 17 sept. 2018 00:51

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....
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#7

Message par jchd » lun. 17 sept. 2018 12:00

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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 202
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

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

#8

Message par mdanielm » mar. 18 sept. 2018 04:17

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!

jpascal
Niveau 4
Niveau 4
Messages : 96
Enregistré le : jeu. 16 oct. 2008 15:21
Status : Hors ligne

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

#9

Message par jpascal » jeu. 20 sept. 2018 11:25

Sinon il y a aussi les variables Local Static. ;-)
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#10

Message par jchd » jeu. 20 sept. 2018 20:43

Le modificateur Static n'indique pas une portée mais empêche la réinitialisation d'une variable (locale) dans une fonction.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mdanielm
Membre émérite
Membre émérite
Messages : 202
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

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

#11

Message par mdanielm » lun. 24 sept. 2018 16:44

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).

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#12

Message par jchd » lun. 24 sept. 2018 17:35

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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Répondre