AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Werden Parameter rückwärts gelesen???
Thema durchsuchen
Ansicht
Themen-Optionen

Werden Parameter rückwärts gelesen???

Ein Thema von Cöster · begonnen am 7. Dez 2006 · letzter Beitrag vom 8. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#1

Werden Parameter rückwärts gelesen???

  Alt 7. Dez 2006, 18:36
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 7. Dez 2006, 18:43
Parameter werden anach dem Stack-Prinzp übergeben.
Markus Kinzler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 7. Dez 2006, 18:53
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
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 7. Dez 2006, 18:56
Zitat von mkinzler:
Parameter werden anach dem Stack-Prinzp übergeben.
http://de.wikipedia.org/wiki/LIFO

-edit-

Muss natürlich LIFO sein :/
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 7. Dez 2006, 19:14
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?
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#6

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

  Alt 7. Dez 2006, 19:35
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 7. Dez 2006, 19:51
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 7. Dez 2006, 19:53
Die Parameter weden auch teilweise über den Systemstack übergeben, welcher bekannlich ein Stapel (Stack) nach unten ist.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

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

  Alt 7. Dez 2006, 19:55
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 7. Dez 2006, 19:55
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz