local / global

Bugs

Modérateur : xcasadmin

Alek
Messages : 111
Inscription : jeu. oct. 28, 2010 1:20 pm

local / global

Message par Alek » mer. févr. 19, 2014 4:59 pm

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

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: local / global

Message par parisse » mer. févr. 19, 2014 6:24 pm

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

Alek
Messages : 111
Inscription : jeu. oct. 28, 2010 1:20 pm

Re: local / global

Message par Alek » jeu. févr. 20, 2014 8:23 am

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.

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: local / global

Message par parisse » jeu. févr. 20, 2014 11:59 am

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

Répondre