[ada-france] PROGRAM_ERROR : access before elaboration

Xavier Nicollin Xavier.Nicollin at imag.fr
Ven 7 Déc 10:08:07 CET 2007


Bonjour,

Thomas De Contes écrit :
> Le 20 nov. 07 à 20:53, Laurent GUERBY a écrit :
> 
>>On Tue, 2007-11-20 at 17:20 +0100, Thomas De Contes wrote:
>>
>>>un paquetage dans lequel je veux simplement mettre des constantes,
>>>qui sont trop compliquées à construire pour pouvoir se faire
>>>directement avec des agrégats, par exemple :
>>>
>>>package defaut is
>>>	pragma Elaborate_Body;
>>>
>>>	pageParDefaut : constant page;
>>>
>>>private
>>>	function constructionPageParDefaut return page;
>>>	pageParDefaut : constant page := constructionPageParDefaut;
>>>end defaut;
>>
>>Tu peux directement mettre dans la partie publique
>>
>>function pageParDefaut return page;
>>
>>Pour l'utilisateur il n'y a pas de difference entre une fonction de ce
>>type et une constante.
> 
> Je me suis aperçu après avoir posté que dans mon cas j'avais plutôt  
> intérêt à faire comme ça, puisque c'était à la limite plus rapide de  
> construire la variable "sur place" que de faire une copie

Il me semble que ça ne pourra être plus rapide que si la fonction
n'est jamais appelée, ou alors je ne comprends pas la définition
de « rapide » ! En tous cas je n'ai pas compris la définition de
« sur place » et de « copie » (à moins que ça n'ait un rapport
avec les types limités auquel cas la constante pageParDefaut
aura bien peu d'utilité... :-)

> (donc pour moi ça n'a rien d'urgent)
> 
> Par contre, il y a des cas où
> - c'est plus long à construire qu'à copier, par exemple parce qu'à la  
> construction il y a des calculs qu'on n'a pas besoin de faire à la copie
> - on n'a tout simplement pas besoin de copier, parce qu'on n'utilise  
> la constante que pour avoir des propriétés, ou pour la mettre en  
> paramètre de fonctions (auquel cas c'est un énorme gâchis de  
> reconstruire à chaque fois, non ? c'est pas optimisé, ça ?)
> 
> Ca m'est deja arrivé
> Je ne sais plus exactement comment j'ai fait, mais il me semble que  
> je trouvais ça pas propre

Je crois que ce que Laurent proposait, c'est d'écrire quelque chose
du genre :

package defaut is
    function pageParDefaut return page;

    ... -- autres déclarations éventuelles

end defaut;

package body defaut is

    function constructionPageParDefaut return page is
       ...
    end constructionPageParDefaut;

    laPageParDefaut : constant page := constructionPageParDefaut;

    function pageParDefaut return page is
    begin
       return laPageParDefaut;
    end pageParDefaut;

    ... -- reste du corps éventuel

end defaut;

Le « constructeur » est ainsi appelé une seule fois. Un pragma Inline
sur pageParDefaut permet même de ne plus avoir de différence avec une
constante exportée.

> Et j'espérais qu'ada 2005 ait apporté ce qu'il faut pour pouvoir  
> faire ça proprement :-)

Il me semble qu'Ada95 (et même Ada83) permettent déjà de rendre les
choses assez propres, non ? Si on veut être encore plus propre, on peut
même écrire (Ada95) :

-- defaut.ads inchangé


private package defaut.exportOnlyPageParDefaut is
    function pageParDefaut return page;
end defaut.exportOnlyPageParDefaut;


with defaut.exportOnlyPageParDefaut;
package body defaut is

    function pageParDefaut return page
       renames defaut.exportOnlyPageParDefaut.pageParDefaut;

    -- reste du corps éventuel

end defaut;


package body defaut.exportOnlyPageParDefaut is

    function constructionPageParDefaut return page is
       ...
    end constructionPageParDefaut;

    laPageParDefaut : constant page := constructionPageParDefaut;

    function pageParDefaut return page is
    begin
       return laPageParDefaut;
    end pageParDefaut;

end defaut.exportOnlyPageParDefaut;

(En Ada83 exportOnlyPageParDefaut serait local au corps de defaut).

XN

-- 
| Institut polytechnique de Grenoble  -  ENSIMAG
| Verimag -- Centre Equation -- 2, ave. de Vignate -- F-38610 Gières


Plus d'informations sur la liste de diffusion Ada-France