2009-03-06 9 views
2

J'ai eu ce problème de mal sur mes devoirs, et je ne peux pas comprendre pourquoi:Pourquoi ai-je mal compris cet article sur mes devoirs?

procedure Main is 
    X: Integer; 
    procedure Sub1 is 
     X: Integer; 
    begin -- of Sub1 
     Put(X); 
    end; -- of Sub1 
    procedure Sub2 is 
     X: Integer; 
    begin -- of Sub2 
     X:=5; 
     Sub1; 
    end; -- of Sub2 
begin -- of Main 
    X:=12; 
    Sub2; 
end; -- of Main 

La question est la suivante: On suppose le programme Ada a été compilé et exécuter la suite en utilisant des règles statiques-portée. Quelle valeur de X est imprimée dans la procédure de Sub1? Et si c'était sous les règles de portée dyncamic?

J'ai obtenu 12 et 5 respectivement, mais cela a été marqué incorrect. Pourquoi?

Répondre

2

Parcourez le programme plus attentivement. D'où vient la valeur de Sub1?

+0

Est-ce le nouvel entier initialisé? Alors, que serait X si ce n'est pas déclaré avec une valeur? 0? – kylex

+0

Je ne me souviens pas si Ada initialise des variables pour vous ou non. Je devrais aller déterrer mon livre de texte du sous-sol quelque part. Je soupçonne que le tien est plus facile à atteindre ;-) –

1

Indice: en mode statique, il n'est pas initialisé. Peux-tu comprendre pourquoi?

2

Ada utilise des règles de portée statiques (lexicales), mais même si ce n'est pas le cas, il est difficile de voir à quoi peut correspondre le Put (X) dans Sub1 autre que les lignes X2 non initialisées. La valeur imprimée dépendra probablement du système d'exploitation, des drapeaux du compilateur utilisés et peut-être même de l'heure du jour. Après avoir corrigé le code, la réponse (en utilisant divers GNATs sur Mac OS X) était 0 en utilisant -O2 pour chacun d'entre eux, mais sans optimisation GCC 4.3.3 obtient 42291, GNAT GPL 2009 (qui est un 64-bit compilateur) obtient 16777216, et une recompilation de GNAT GPL 2009 pour 32 bits obtient 1.