Delphi Problem mit verschachtelten procedures

koffi

Lt. Junior Grade
Registriert
Jan. 2007
Beiträge
493
hey!
hab ein problem mit den folgenden 2 verschachtelten procedures.
normal müsste ja wenn TForm1.Button1Click ausgeführt wird zunächst die procedure p übersprungen werden und erst aufgerufen werden wenn in der äuseren procedure p(b,a); ausgeführt wird.

Code:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
procedure p(z:integer;b:integer);
  var a:integer;
    begin
    a:=6+z;
    c:=c+b;
    z:=c;
    b:=a+z;
   end;

   begin
   a:=2;
   b:=3;
   c:=5;
  p(b,a);
  label1.caption := inttostr(a);
  label2.caption := inttostr(b);
  label3.caption := inttostr(c);
end;

gut. nun nehmt mal bitte stift und papier zur hand und errechnet von hand was die 3 labels am ende ausgeben müssten. bei mir kommt 9 16 und 7 raus.
dann habe ich das ding in als program geschrieben und zu meienr verwunderung werden die zahlen 2 3 und 7 ausgegeben!

wie erklärt ihr euch das?
danke
 
Nun, ganz einfach:

Du hast in deiner inneren Prozedur keine var-Parameter definiert, d.h. die Übergabeparameter (a,b) bleiben konstant.
Einzig die im Kontext der inneren Prozedur "globale" Variable "c" kann verändert werden.

Tolotos
 
naja ich als C Programmierer finde das alles sowieso ein wenig seltsam.

p grenzt ja keineswegs mit Klammern einen codeblock ein ... sondern wird schon vorher beendet (';') oder ist dass bei dieser Sprache anders?

so oder so seh ich nrigends einen logischen ablauf von definierten variablen.
undefinierte variablen geben meist chaos...
 
Zuletzt bearbeitet:
Code:
procedure TForm1.Button1Click(Sender: TObject);
	var a,b,c:integer;

	procedure p(z:integer;b:integer);
		var a:integer;
	begin
		a:=6+z;
		c:=c+b; // -------- nur diese Anweisung hat Auswirkung auf übergeordnete Prozedur
		z:=c;
		b:=a+z;
	end;
begin
	a:=2;
	b:=3;
	c:=5;
	p(b,a);

	label1.caption := inttostr(a);
	label2.caption := inttostr(b);
	label3.caption := inttostr(c);
end;

Die innere Prozedur p überschreibt in ihrem Namenraum, die Variablen: b und a.
Ausserdem defniert zusätzlich die Variable z aus dem Namensraum der äußeren Procedur wird
die Variable c übernommen.

Folgelich ist intern folgendes:

a := 6+z; //bei dir wegen p(3,2): a:= 9
c := c+b; //c := c + 2
...

die restlichen Anweisungen haben ebenfalls nur im internen Scope eine Auswirkungen,
sind also mehr oder weniger nutzlos.

Das Ergebnis ist also völlig korrekt
 
Zurück
Oben