[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