![]() |
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:
Dieser Code hingegen liefert 42:
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;
Delphi-Quellcode:
Hat das irgendeinen Sinn?
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; |
Re: Werden Parameter rückwärts gelesen???
Parameter werden anach dem Stack-Prinzp übergeben.
|
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 |
Re: Werden Parameter rückwärts gelesen???
Zitat:
![]() -edit- Muss natürlich LIFO sein :/ |
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?
|
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 |
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? |
Re: Werden Parameter rückwärts gelesen???
Die Parameter weden auch teilweise über den Systemstack übergeben, welcher bekannlich ein Stapel (Stack) nach unten ist.
|
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.
|
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. |
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