Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Werden Parameter rückwärts gelesen??? (https://www.delphipraxis.net/82075-werden-parameter-rueckwaerts-gelesen.html)

Cöster 7. Dez 2006 18:36


Werden Parameter rückwärts gelesen???
 
Hi!

Ist es normal, dass Parameter rückwärts eingelesen werden? Die beiden folgenden Codes zeigen das nämlich:

So wird 24 gezeigt, ganz normal also:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
   Stack: TStack;
begin
   Stack := TStack.Create;
   Stack.Push(Pointer(4));
   Stack.Push(Pointer(2));
   ShowMessage(IntToStr(Integer(Stack.Pop)) + IntToStr(Integer(Stack.Pop)));
   Stack.Free;
   Application.Terminate;
end;
Dieser Code hingegen liefert 42:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
   Stack: TStack;
begin
   Stack := TStack.Create;
   Stack.Push(Pointer(4));
   Stack.Push(Pointer(2));
   ShowMessage(xyz(Integer(Stack.Pop), Integer(Stack.Pop)));
   Stack.Free;
   Application.Terminate;
end;

function xyz(a, b: Integer): string;
begin
   Result := IntToStr(a) + IntToStr(b);
end;
Hat das irgendeinen Sinn?

mkinzler 7. Dez 2006 18:43

Re: Werden Parameter rückwärts gelesen???
 
Parameter werden anach dem Stack-Prinzp übergeben.

Hawkeye219 7. Dez 2006 18:53

Re: Werden Parameter rückwärts gelesen???
 
Bei Operationen mit Seiteneffekten (in diesem Fall der Aufruf der Funktion Pop) ist immer Vorsicht geboten. Der Compiler kann durchaus die Operanden vertauschen, wenn sich beispielsweise dadurch ein effizienterer Maschinencode erzeugen läßt. Man ist immer auf der sicheren Seite, wenn man die Operanden zunächst in lokale Variablen lädt und erst dann die Operation durchführt.

Gruß Hawkeye

ste_ett 7. Dez 2006 18:56

Re: Werden Parameter rückwärts gelesen???
 
Zitat:

Zitat von mkinzler
Parameter werden anach dem Stack-Prinzp übergeben.

http://de.wikipedia.org/wiki/LIFO :)

-edit-

Muss natürlich LIFO sein :/

Cöster 7. Dez 2006 19:14

Re: Werden Parameter rückwärts gelesen???
 
Wieso kann LIFO oder FIFO (was denn jetzt eig.?) denn zum umdrehen der Parameter führen? Oder hab ich ste_etts Post so zu verstehen, dass es eben dadurch nicht passieren kann und nur Hawkeyes Begründung der Grund ist?

JasonDX 7. Dez 2006 19:35

Re: Werden Parameter rückwärts gelesen???
 
Der Grund, warum die Parameter von rechts nach links abgearbeitet werden ist, dass sie von rechts nach links auf den Stack gepusht (bzw. in Register geschoben), also auch von rechts nach links abgearbeitet werden. Wenn du mehr darueber wissen willst, wann und warum Elemente von links oder von rechts in den Stack oder Register geschoben werden, duerfte dich das Stichwort Calling Convention interessieren.

greetz
Mike

Cöster 7. Dez 2006 19:51

Re: Werden Parameter rückwärts gelesen???
 
Ah, kapiert, also sie werden von rechts nach links eingelesen, damit sie nachher wieder von links nach rechts ausgelesen werden.

Dann fände ich aber erlich gesagt eine Schlange logischer, dann könnte man auch von links nach rechts einlesen. Oder hat der Stack noch irgendeinen Vorteil gegenüber der Schlange?

mkinzler 7. Dez 2006 19:53

Re: Werden Parameter rückwärts gelesen???
 
Die Parameter weden auch teilweise über den Systemstack übergeben, welcher bekannlich ein Stapel (Stack) nach unten ist.

SirThornberry 7. Dez 2006 19:55

Re: Werden Parameter rückwärts gelesen???
 
es wird nicht generell von links nach recht oder umgekehrt auf dem stack abgelegt. Es kommt eben auf die Calling-Convention an. Die Schlange wäre zwar toll aber dann hätte man das Problem das man nicht einfach was rausziehen kann weil sich sonst alles dahinter verschiebt und somit niemand mehr wüsste wo die Daten nun liegen. Daher der Stack, da wird immer drauf gepackt und somit ist immer das oberste aktuell.

3_of_8 7. Dez 2006 19:55

Re: Werden Parameter rückwärts gelesen???
 
Ja die hat er: Eine Schlange kriecht in eine Richtung, ein Stack wächst und schrumpft gleichmäßig. Außerdem würdest du ansonsten die Parameter der ersten aufgerufenen Funktion aufrufen, du willst aber die Parameter deiner Funktion.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz