Page 1 sur 1

local / global

Publié : mer. févr. 19, 2014 4:59 pm
par Alek
Bonjour,
Une variable locale ne devrait-elle pas couvrir la variable globale (d'un même nom) ?

Si oui, j'aurais l'exemple suivant où cela ne marcherait pas:

Code : Tout sélectionner

pgcd_nbr(a,b):= {
r:= b;
cpt:=0;
tantque not(r = 0) faire
  r := irem(a,b)
  cpt := cpt+1;
  a := b;
  b := r;
ftantque;
return cpt;
}:;

pgcd_nbr(12303433,34);

a_max(b):= {
local r;
r:=0;
pour k de b jusque 1000 faire
  p:=pgcd_nbr(k,b);
  si p>r alors
    r := p;
    k0 := k;
  fsi;
fpour;
return k0,r 
}:;

a_max(30) 
La variable "r" est globale et modifiée dans pgcd_nbr, mais on utilise le meme nom pour une variable locale dans a_max.
Je trouve que la procédure pgcd_nbr, appelée depuis a_max, modifie la variable r locale pour a_max (ça remet toujours r=0).
Est-ce normal ?

ps. version 1.1.0-36

Re: local / global

Publié : mer. févr. 19, 2014 6:24 pm
par parisse
Normal, je ne sais pas (je ne suis pas spécialiste en langage, j'ai implémenté sans chercher très loin), en tout cas c'est le schéma utilisé pour la résolution des noms de varibles, il utilise pour r la 1ère variable accessible dans un contexte, d'abord dans le contexte local courant s'il existe, puis le précédent, etc. jusqu'à remonter au contexte global.
D'où l'intérêt de bien déclarer tout en variables locales...

Re: local / global

Publié : jeu. févr. 20, 2014 8:23 am
par Alek
Merci pour la réponse, maintenant je comprends mieux.
Ce qui m'a surpris, c'est que le context "précédent" est celui da la fonction qui appelle pgcd_nbr, ce qui est relativement difficile à contrôler.
(J'aurais tendance à dire que, faute d'une declaration locale, le contexte précédent est plutôt celui global;
par ailleurs c'est ce que semble dire le message d'avertissement xcas).

Bon, en effet il vaut mieux tout declarer tout en local, c'est la meilleure isolation entre les couches.

Re: local / global

Publié : jeu. févr. 20, 2014 11:59 am
par parisse
Oui, je changerai peut-etre cela pour la version 1.2, mais pour le moment je garde en l'etat j'ai trop peur de casser quelque chose sinon...