Re: renames

Thomas De Contes <[email protected]>
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Le mardi, 16 aoû 2005, à 22:34 Europe/Paris, Laurent GUERBY a écrit :

> On Tue, 2005-08-16 at 22:05 +0200, Thomas De Contes wrote:
>> Bonjour :-)
>>
>>
>> J'ai :
>> p :machin renames s.p(cnd.m);
>>
>> s et cnd sont des variables
>> s.p est un tableau de machin, cnd.m est l'index
>>
>> Je modifie cnd.m après cette déclaration,
>> et apparemment, quand j'utilise p après, cnd.m a l'ancienne valeur,
>> cad que qqch aurait été figé au moment de la déclaration du renames
>>
>> Ca me surprends, parce que je pensais que "renames" c'était uniquement
>> un raccourci, et que *tout* était recalculé à chaque fois
>>
>>
>> Est ce que qqn pourrait m'expliquer comment ça marche exactement, svp 
>> ?
>> quand il y a des fonctions par exemple
>
> renames s'applique a des objets et non a des expressions symboliques
> c'est pour ca que tu as ce comportement. Quand il y a des fonctions
> c'est l'objet resultat de l'appel initial.

aaaah !! ok :-))


Le mercredi, 17 aoû 2005, à 09:19 Europe/Paris, Jean-Pierre Rosen a 
écrit :

> Il y a une règle très simple en Ada: toute déclaration est élaborée, 
> et sa signification ne change pas après l'élaboration.

Je crois que j'arrive pas encore à cerner tout ce que recouvre 
"élaborer"

> Dans le cas d'un rename, on *élabore* la déclaration; pour celà, on 
> *évalue* l'expression, puis le nom désigne le résultat de cette 
> évaluation. Cela n'a rien à voir avec une substitution de style 
> "macro".

Ok, je pense comprendre le cas particulier du rename :-)


> C'est d'ailleur un bon moyen de faire le presque equivalent d'une
> affectation sur des objets dont le type est limité privé :
>
> procedure PP is
>    type T is limited null record;
>    Tmp : T;
>    function F return T is
>    begin
>       return Tmp;
>    end F;
>    -- Y : T := F; -- Illegal
>    Y : T renames F; -- Legal
> begin
>    null;
> end PP;

Alors ça veut dire que dans :

procedure PP is
    type enormetruc is null record;
    function F return enormetruc is
       Tmp : enormetruc;
    begin
       gros calcul de plusieurs minutes;
       return Tmp;
    end F;
    Y : T renames F;
begin
    null;
end PP;

Le gros calcul est fait une seule fois, au moment du renames ?
Je croyais qu'il serait fait à chaque utilisation de Y !!

Ca veut dire qu'au moment de l'"élaboration" de Y, il y a 2 choses :
- La fonction est calculée
- Allocation d'un emplacement mémoire pour y mettre le résultat de la 
fonction (en l'occurrence ça doit être celui de Tmp qui est gardé), qui 
sera pointé à chaque utilisation de Y (ce qu'il n'y aurait pas si Y 
pointait qqch de modifiable)
C'est bien ça ? :-)

Génial, ça veut dire qu'il y a plein de déclarations de constantes qui 
vont sauter, et de pragma Preelaborate qui vont réapparaître :-)))

_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/
[email protected]
http://www.ada-france.org/mailman/listinfo/ada-france
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.