Bonjour,
Je suis étonné qu’on puisse déclarer, par mégarde, une variable locale du même nom qu’une variable globale sans recevoir d’erreur ou d’avertissement à la compilation. Je n’ai pas trouvé d’option à ce sujet. Aurais-je mal cherché ?
Bonjour,
Je suis étonné qu’on puisse déclarer, par mégarde, une variable locale du même nom qu’une variable globale sans recevoir d’erreur ou d’avertissement à la compilation. Je n’ai pas trouvé d’option à ce sujet. Aurais-je mal cherché ?
Il est tout à fait possible de déclarer une variable locale du même nom qu'une variable globale dans un langage structuré.
Dans un langage structurée un bloc définit une partie délimitée de programme. Dans la figure ci-dessus en haut quatre blocs A,B,C et D.
la variable v1 définie dans le bloc A est visible et utilisable dans ce bloc et dans tous les blocs imbriqués (B,C,D). La variable v2 définie dans le bloc C n’est utilisable que dans les blocs C et D. Le conception structurée permet une représentation arborescente. La variable V2 peut s'appeler V1 puisqu'elle n'est pas dans le même bloc
Ah, ok, merci pour ces précisions !
En fait, j’ai toujours veillé à mettre des noms différents car je travaille souvent avec un autre compilateur (pour microcontrôleurs) qui ne fait pas cette différence, c'est-à-dire que la variable locale modifie la globale (mais évidemment pas l’inverse).
Je pensais d’ailleurs que c’est pour cette raison qu’il est déconseillé d’employer des variables globales.
peux tu me préciser de quel compilateur tu parles ? car la modification d'une variable globale quand on modifie une locale, c'est de l'ordre du bug, ou c'est toi qui te trompe dans tes explications ?!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 program exemple; var v: Integer; // variable globale procedure test1(v: Integer); // paramètre begin // v = 100 v := 2; // ne sert à rien mais c'est possible // v = 2 end; procedure test2; var v: Integer; // variable locale begin v := 3; // ne sert à rien mais c'est possible end; begin v := 1; test1(100); test2(); // ici v (global) est toujours égal à 1 end;
Il s’agit d’un compilateur Pascal pour microcontrôleurs AVR Atmel.
Mais je fais amende honorable :
c’était en effet un bug qui a été corrigé, il y a même un certain temps. Je viens de le vérifier en consultant les notes de mises à jour.
En fait, je continuais à éviter les doublons de noms parce que j’avais passé un moment à chercher un défaut dans mon programme, sans savoir que ce bug du compilateur avait été éradiqué.
Cela dit, c’était aussi une erreur de ma part d’avoir utilisé 2 fois le même nom, parce que c’est quand même un facteur de confusion.
Salut
C'est plutôt grave comme bug, car la notion de portée est fondamentale en Pascal. Je ne serai pas trop rassuré avec un tel compilateur...
Cdlt
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager