Global, Shared et EnableExplicit

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Global, Shared et EnableExplicit

Message 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.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Global, Shared et EnableExplicit

Message 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).
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Global, Shared et EnableExplicit

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Global, Shared et EnableExplicit

Message 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 ""

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Global, Shared et EnableExplicit

Message 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:
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Global, Shared et EnableExplicit

Message 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 :?.
Répondre