Page 1 sur 1

Global, Shared et EnableExplicit

Publié : jeu. 17/janv./2019 7:56
par Naheulf
Bonjour,
Est-ce que quelqu'un peu m'expliquer la différence entre ces deux codes :

Code : Tout sélectionner

a = 10

Procedure Change()
    Shared a
    a = 20
EndProcedure

Change()
Debug a   ; Affichera 20, car la variable est partagée.

Code : Tout sélectionner

Global a = 10

Procedure Change()
    a = 20
EndProcedure

Change()
Debug a   ; Affichera 20, car la variable est globale.
Mis à part le fait que seule la seconde fonctionne avec un EnableExplicite général je ne voie pas trop...

De plus, dans le code suivant, je ne voir pas pourquoi le compiler ne génère pas d'erreur alors que l'origine de "a" n'est pas explicitement déclarée dans la procédure. On pourrait très bien être retombé sur la variable "a" globale par erreur alors qu'on voulait une variable protected qu'on a oublié de déclarer... Pour le coup cela ressemble plus à du "EnableSemiExplicit" si vous voyez ce que je veut dire...

Code : Tout sélectionner

Global a = 10

Procedure Change()
    EnableExplicit
    a = 20 ; N'affichera pas d'erreur de compilation
EndProcedure

Change()
Debug a   ; Affichera 20, car la variable est globale.

Re: Global, Shared et EnableExplicit

Publié : jeu. 17/janv./2019 8:08
par djes
EnableExplicit est une directive de compilation qui active une vérification du code source avant de le compiler.
Par contre, la portée des variables affecte le code compilé.

Une variable globale n'est pas stockée ni gérée de la même façon qu'une variable locale, qu'elle soit partagée ou non.
La variable locale n'est pas accessible ailleurs, par défaut.

Toutes ces possibilités servent essentiellement à créer des codes plus ou moins réutilisables (réutilisation de procédures), plus ou moins protégés (dans un long programme, une variable globale peut facilement être modifiée par erreur) et plus ou moins propre (notion de code spaghetti).

Re: Global, Shared et EnableExplicit

Publié : jeu. 17/janv./2019 12:47
par Ollivier

Code : Tout sélectionner

EnableExplicit
A = 20 ; pas bien

Code : Tout sélectionner

EnableExplicit
Define A = 20 ; bien

Code : Tout sélectionner

Procedure UneRoutine()
    Shared A = 20 ; A consommer avec modération
EndProcedure

Re: Global, Shared et EnableExplicit

Publié : jeu. 17/janv./2019 13:09
par Ar-S
3 petits exemples utilisant define, protected et global

Code : Tout sélectionner

;Exemple 1
Define.b A = 20 ; on assigne a une valeur .b (un octet) à A donc de -128 à 127. Pratique pour ne pas bouffer trop de mémoire pour les états 0 ou 1 par exemple
Debug "Hors procédure, A = " + Str(A) + " et sa taille est de "+ Str(SizeOf(A)) +" octet grace au .b"

Procedure.b ReturnA()
  ProcedureReturn A  
EndProcedure

Debug "Dans la procédure, ReturnA() retourne A = " + Str(ReturnA()) + " car A ne fait pas partie de la procedure. Donc attention à ce genre d'erreurs"
Debug ""

; Exemple 2 - Global
Global.b B = 20 ; cette fois on dit au programme que cette variable de type .b doit être appliquée dans tout le programme, procedures incluses
Debug "Hors procédure, B = " + Str(B) + " et sa taille est de "+ Str(SizeOf(B)) +" octet grace au .b"

Procedure.b ReturnB()
  ProcedureReturn B  
EndProcedure

Debug "Dans la procédure, ReturnB() retourne B = " + Str(ReturnB()) + " car B est maintenant une variable GLOBAL"
Debug ""

; Exemple 3 - Protected

Global.b C = 20 
Debug "Hors procédure, C = " + Str(C) + " et sa taille est de "+ Str(SizeOf(C)) +" octet grace au .b"

Procedure.b ReturnC()
  Protected C = 7
  ProcedureReturn C  
EndProcedure

Debug "Dans la procédure, ReturnC() retourne C = " + Str(ReturnC()) + " car la variable C utilisée est celle contenue et protégée dans la procédure"
Debug ""


Re: Global, Shared et EnableExplicit

Publié : jeu. 17/janv./2019 16:27
par Marc56

Code : Tout sélectionner

Global a = 10

Procedure Change()
    EnableExplicit
    a = 20 ; N'affichera pas d'erreur de compilation
EndProcedure
Pas d'erreur puisque 'a' a été déclaré Global, donc visible dans la procédure. :)

Mettre EnableExplicit dans la procédure est un peu inattendu, mais comme l'a indiqué djes c'est une directive de compilation.
La vérification ne va donc commencer que là.
Il est conseillé de ne mettre qu'un seul EnableExplicit (au début du premier source)

:idea: Il avait d’ailleurs été proposé que "Fichier > Nouveau" mette cette ligne d'office pour "forcer" les nouveaux à coder proprement. Et même pour les habitués, ça sert aussi à éviter les fautes inattention.
De même ce serait bien d'avoir une option pour interdire l'utilisation d'identifiant numérique pour les gadgets / image / handles de fichier etc. Combien de fois on se retrouve avec une icône à la place d'une autre parce qu'on a utilisé par mégarde le même numéro, sans oublier que 0 (rien) est aussi un ID donc on a parfois une image alors qu'elle n'est pas créée :?

:wink:

Re: Global, Shared et EnableExplicit

Publié : mar. 22/janv./2019 22:07
par Naheulf
Merci pour vos retours. Il me semblait l'avoir déjà dit mais j'ai dû oublier d'appuyer sur le bouton « Envoyer » après avoir vu l'aperçu du message :?.