2009-03-06 9 views
2

Ich habe dieses Problem falsch auf meinen Hausaufgaben, und ich kann nicht herausfinden, warum:Warum habe ich diesen Artikel bei meinen Hausaufgaben falsch verstanden?

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 

Die Frage ist: Angenommen, das folgende Ada-Programm kompiliert wurde, und führt statisch-Scoping-Regeln. Welcher Wert von X wird in der Prozedur von Sub1 gedruckt? Was wäre, wenn es unter den Dyncamic-Scoping-Regeln stünde?

Ich habe 12 und 5, aber das wurde als falsch markiert. Warum?

Antwort

2

Schritt durch das Programm vorsichtiger. Woher kommt der Wert in Sub1?

+0

Ist es die neue initialisierte Ganzzahl? Was wäre also X, wenn es nicht mit einem Wert erklärt wird? 0? – kylex

+0

Ich erinnere mich nicht, wenn Ada Variablen für Sie initialisiert oder nicht. Ich müsste irgendwo mein Lehrbuch aus dem Keller ausgraben. Ich vermute, deine ist leichter zu erreichen ;-) –

1

Hinweis: unter statischen Scoping ist es nicht initialisiert. Kannst du herausfinden warum?

2

Ada verwendet statische (lexikalische) Scoping-Regeln, aber selbst wenn dies nicht der Fall ist, ist es schwer zu sehen, was Put (X) in Sub1 auf andere als die nicht initialisierten X 2-Zeilen darüber beziehen kann. Der gedruckte Wert hängt wahrscheinlich vom Betriebssystem, den verwendeten Compiler-Flags und vielleicht sogar von der Uhrzeit ab.

Nach der Korrektur des Codes war die Antwort (mit verschiedenen GNATs auf Mac OS X) 0 für alle mit -O2, aber ohne Optimierung erhält GCC 4.3.3 42291, GNAT GPL 2009 (was ein 64-Bit ist Compiler) bekommt 16777216, und eine Neukompilierung von GNAT GPL 2009 für 32-Bit bekommt 1.