Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi vertauscht Variablen bei Funktionsaufruf ? wös? (https://www.delphipraxis.net/155182-delphi-vertauscht-variablen-bei-funktionsaufruf-woes.html)

Daniel 12. Okt 2010 10:32

Delphi-Version: 2007

Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Moin,

also das ist ja 'n Ding. Ich habe folgende Funktion:

Delphi-Quellcode:
Function MyFunction(i : Integer; r1, r2, r3, r4, r5 : single ) : string;
Die rufe ich mit festen Parametern auf:
Delphi-Quellcode:
FFormelString := MyFunction( 1, 2.00, 3.00, 4.00, 5.00, 6.00 );
So weit, so gut. Wenn Delphi nicht meine fünf Parameter r1 bis r5 in der Reihenfolge umdrehen würde. Der Debugger zeigt's so an und wenn ich mir in der Funktion die Variablen ausgeben lassen, dann wird es bestätigt: r1 = 6, r2 = 5, r3 = 4, r4 = 3, r5 = 2.
:shock:

Die Fragestellung, welche Variable wo landen soll, kannte ich bisher nur aus dem Kontext von DLLs. Aber hier reden wir über eine EXE-Datei, in der das passiert. Kann sich - und dann mir - einer erklären, was hier passiert?

himitsu 12. Okt 2010 10:34

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Sowas hatte ich noch nie. :shock:
Wäre auch böse, wenn soein Fehler generell auftreten würde
und es wäre schon längt behoben. :stupid:

Vielleicht bist du ja auf einen Compilerfehler gestoßen?
In 'nem Test tritt es jedenfalls nicht auf.
Delphi-Quellcode:
Function MyFunction(i : Integer; r1, r2, r3, r4, r5 : single ) : string;
begin
  Result := IntToStr(i);
  Result := Result + ' ' + FloatTostr(r1);
  Result := Result + ' ' + FloatTostr(r2);
  Result := Result + ' ' + FloatTostr(r3);
  Result := Result + ' ' + FloatTostr(r4);
  Result := Result + ' ' + FloatTostr(r5);
  // auch über ein gemeinsammes Format nix Anderes
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
  Caption := MyFunction( 1, 2.00, 3.00, 4.00, 5.00, 6.00 );
end;
Nutzt du hier die Standard-Aufrufkonventionen bei dieser Funktion, bzw. in der aufrufenden Funktion.

Zacherl 12. Okt 2010 10:39

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Eventuell falsche Aufrufkonvention verwendet? Sowas kommt vor, wenn man mal ein stdcall oder so vergisst :D

mkinzler 12. Okt 2010 10:39

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Scheint sich um ( eine falsche) cdecl Aufrufskonvention zu handeln

DeddyH 12. Okt 2010 10:42

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Ich dachte, es ist keine DLL? Auf meinem Delphi 2007 kann ich das jedenfalls nicht nachvollziehen.

Luckie 12. Okt 2010 10:42

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
War auch mein erster Verdacht. Aber erstens gibt man eigentlich in Delphi für eigene Routinen keine Aufrufkonvention an und zweitens hätte Daniel das wohl erwähnt bzw. man sieht es auch am Code, dass keine eigene Aufrufkonvention angegeben wurde.

himitsu 12. Okt 2010 10:46

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Zitat:

Zitat von Luckie (Beitrag 1055249)
bzw. man sieht es auch am Code, dass keine eigene Aufrufkonvention angegeben wurde.

Nicht wenn er es im Interface angegeben hat. :wink:

Also innerhalb der EXE wird ja überall die selbe Deklaration verwendet.
Bei der DLL können es unterschiedliche Deklarationen sein, welche sich dann natürlich unterscheiden könnten.

Darum würde ich hier entweder auf eine alte/falsche/fehlerhafte DCU tippen (alles neu Erzeugen würde das klären, aber ich glaub eher nicht dran),

oder eben ein Compiler-Fehler.
Also wo der Compiler irgendwie durcheinander kommt und irgendwo/-wie mit der Reihenfolge durcheinander kommt.
Immerhin kennt er ja mehrere Aufrufkonventionen.

Luckie 12. Okt 2010 10:49

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Eventuell liegt auch an anderer Stelle ein Fehler im Code vor, der den Compiler durcheinander bringt.

Daniel 12. Okt 2010 11:03

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Merkwürdig.
Ich habe alle DCUs weggelöscht, die Optimierung erst an, dann ausdrücklich wieder ausgeschaltet und alles neu erzeugt. Nu kommt zwar das richtige Ergebnis raus, aber der Debugger zeigt mir nach wie vor die falsche Reihenfolge.

Im Aufrufpfad konnte ich keine Angaben von Aufrufkonventionen finden. In einem Mini-Projekt kann ich das ebenfalls nicht nachvollziehen. hm.

mkinzler 12. Okt 2010 11:05

AW: Delphi vertauscht Variablen bei Funktionsaufruf ? wös?
 
Der Compiler scheint aber fälschlicherweise eine anzunehmen


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 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