Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Compiler Problem Reihenfolge der Ausführung (https://www.delphipraxis.net/207084-compiler-problem-reihenfolge-der-ausfuehrung.html)

t2000 23. Feb 2021 09:40

Compiler Problem Reihenfolge der Ausführung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,

ich habe mal wieder einen richtig blöden Fehler, bzw. weiß ich nicht wieso das so passiert.

Mein Quelltext sieht so aus: (Ausschnitt)

Delphi-Quellcode:
begin
  FInInit := True;
  try
    FOnColorChanged := nil;

    trackbarHelligkeit.Range.Min := round( ccLumDelta * 100);
    trackbarHelligkeit.Range.Max := round( (ccLumDelta+ccIdleReduce) * 100);

    btnAkzent.Down := True;
    btnAkzentClick( nil);

    LStylename := TStyleManager.ActiveStyle.Name;

    SetVCLStyle( LStylename, ccColormode); // um den Stylenamen (var) zu bereinigen
    lblCurrentStylename.Caption := LStylename;
Wichtig ist die Zeile
LStylename := ...
mit anschließendem
SetVCLStyle( LStylename, ...

Ist setze eine Variable und übergebe sie anschließend einer Funktion als VAR-Parameter.

Jetzt kommt die CPU-Ansicht im Debugger:
siehe Bild
Die Zeile 141 ist ganz nach oben gerutscht

Dort wird dies hier aufgerufen:

Code:
FInInit := True;
try
  SetVCLStyle( ...
Also es wird erst die Funktion gestartet und später erst die Variable initialisiert.

Was ist das?

TiGü 23. Feb 2021 10:23

AW: Compiler Problem Reihenfolge der Ausführung
 
Ist das unter 32-Bit kompiliert auch so?

dummzeuch 23. Feb 2021 10:26

AW: Compiler Problem Reihenfolge der Ausführung
 
Ich sehe da die Zuweisung der lokalen Variable überhaupt nicht. Vermutlich hat der Compiler die lokale Variable einfach wegoptimiert.

Uwe Raabe 23. Feb 2021 10:42

AW: Compiler Problem Reihenfolge der Ausführung
 
Der Maschinencode passt aber überhaupt nicht zu dem darüber stehenden Delphi-Code. Irgendetwas passt da ganz und gar nicht.

t2000 23. Feb 2021 10:49

AW: Compiler Problem Reihenfolge der Ausführung
 
Ich habe ca. 10 Zeilen Kommentar hier gelöscht, daher wäre die Zeile 141 eigentlich etwas niedrieger.

Nein, er zieht die "SetVCLStyle" Zeile nach oben. Der Rest ist auch im CPU-Fenster völlig ok.

2 vielleicht wichtige Dinge:

- SetVCLStyle() ist eine Funktion, bei der mich das Result nicht interessiert.
- wenn ich anstatt "SetVCLStyle( ..." schreibe "if SetVCLStyle() <> '(dummy)' then", dann funktioniert alles.

Es ist alles unter 64bit compiliert. 32bit habe ich gar nicht im Projekt. Müsste das erst hinzufügen, weiß aber nicht welche anderen Probleme auftauchen.

Ich werde meinen hack mit der if-Abfrage stehen lassen. So funktioniert es ja.

Die Zuweisung der lokalen Variable im CPU-Fenster käne einige Zeilen tiefer. Passte nicht auf den Bildschirm.

himitsu 23. Feb 2021 10:53

AW: Compiler Problem Reihenfolge der Ausführung
 
In Win64 hatten wir hier vor Kurzem ein kleines Problem, wo wir auch erst ratlos waren.

Ich hab es nicht mehr genau im Kopf, aber so grob in etwa kam es auf sowas raus.
Delphi-Quellcode:
var Global: Integer;

funktion Test(var i: Integer): Boolean;
begin
  Global := i;
  Result := irgendwas;
end;

if (Global = 0) and Test(i) then
In Win32 wurde erst Global geprüft und dann Test ausgeführt,
aber in Win64 erst Test und dann Global.


Bzw. genauer war es eigentlich Win64 im C++, wo ein Code nach Win64 in Delphi konvertiert wurde und dort falsch andere Ergebnisse lieferte.
(rein logisch, wo ich den Code betrachtete, sah es im Delphi für mich "richtiger" aus, aber das Ergebnis vom C++ war Vorgabe und dementsprechend mußte dann der Delphi-Code geändert werden)

Sailor 23. Feb 2021 11:25

AW: Compiler Problem Reihenfolge der Ausführung
 
Schau mal in den Optionen nach, ob der Schalter "Extended Syntax" aktiviert ist. Der erlaubt u.a. die Verwendung von Funktionsaufrufen als Statement. Oder gibt es diese Einstellung in den neueren Delphiversionen nicht mehr?

himitsu 23. Feb 2021 11:54

AW: Compiler Problem Reihenfolge der Ausführung
 
Diese Option gibt es noch (zumindestens in Win32) und sie ist nur für die Abwärzskompatibilität von uraltem Code vorgesehn.
Sie ist standardmäßig an und sie macht genau das Gegenteil ... wenn Aus, dann müssen Rückgaben von Funktionen verarbeitet werden, also wie eine Prozedur aufrufen und das Result ignorieren geht dann nicht.

Das hat aber hiermit nichts zu tun.

Uwe Raabe 23. Feb 2021 12:14

AW: Compiler Problem Reihenfolge der Ausführung
 
Zitat:

Zitat von t2000 (Beitrag 1483580)
Nein, er zieht die "SetVCLStyle" Zeile nach oben. Der Rest ist auch im CPU-Fenster völlig ok.

Es stimmt zwar, dass die Sourcecode-Zeile mit SetVclStyle nach oben gezogen wird, aber ich glaube kaum dass ein OpCode:
Code:
mov qword ptr [rbp+$38], $0000000000000000
einem Aufruf von SetVclStyle entspricht.

Leider ist die zu erwartende Position des Aufrufs in dem Screenshot nicht zu sehen.

Du könntest ja mal die Opcodes mit und ohne dem if-Workaround vergleichen. Ich vermute, dass lediglich die eingeblendete Source-Zeile nicht passt.

t2000 23. Feb 2021 14:18

AW: Compiler Problem Reihenfolge der Ausführung
 
Ich habe hier mal die kompletten Auszüge der CPU für bei Versionen.
Habe gerade sehr viel Hotline am Telefon. Kann nicht viel testen.

Source

Delphi-Quellcode:
  try
    FOnColorChanged := nil;

    trackbarHelligkeit.Range.Min := round( ccLumDelta * 100);
    trackbarHelligkeit.Range.Max := round( (ccLumDelta+ccIdleReduce) * 100);

  //  // *** Styles - Combobox füllen    aktuell keine ComboBox
  //  sl := TStringlist.Create;
  //  try
  //    // erst in Stringlist, damit ich sortieren und verschieben kann
  //    for LStylename in TStyleManager.StyleNames do
  //      sl.Add( LStylename);
  //    sl.Sort;
  //    sl.Move( sl.IndexOf( 'Windows'), 0);
  //    for i := 0 to sl.Count-1 do
  //      cbStyle.Add( sl[i]);
  //  finally
  //    sl.Free;
  //  end;
  //  cbStyle.ItemIndex := cbStyle.IndexOfCaption( TStyleManager.ActiveStyle.Name);

    btnAkzent.Down := True;
    btnAkzentClick( nil);

    LStylename := TStyleManager.ActiveStyle.Name;
    {if} SetVCLStyle( LStylename, ccColormode);// <> '(dummy)' then // um den Stylenamen (var) zu bereinigen
      lblCurrentStylename.Caption := LStylename;   // ohne if-Abfrage macht der Compiler Mist
CPU mit der if-Anweisung
Code:
VCL.Color.Frame.pas.120: try
000000000181AEF0 90               nop
VCL.Color.Frame.pas.121: FOnColorChanged := nil;
000000000181AEF1 488B4560         mov rax,[rbp+$60]
000000000181AEF5 488D80E0060000   lea rax,[rax+$000006e0]
000000000181AEFC 48C70000000000   mov qword ptr [rax],$0000000000000000
000000000181AF03 48C7400800000000 mov qword ptr [rax+$08],$0000000000000000
VCL.Color.Frame.pas.123: trackbarHelligkeit.Range.Min := round( ccLumDelta * 100);
000000000181AF0B 488B056E63AB00   mov rax,[rel $00ab636e]
000000000181AF12 F3480F5A00       cvtss2sd xmm0,qword ptr [rax]
000000000181AF17 F20F590559010000 mulsd xmm0,qword ptr [rel $00000159]
000000000181AF1F E86C15BFFE      call @Round
000000000181AF24 488B4D60         mov rcx,[rbp+$60]
000000000181AF28 488B8900050000   mov rcx,[rcx+$00000500]
000000000181AF2F 488B89A0080000   mov rcx,[rcx+$000008a0]
000000000181AF36 89C2             mov edx,eax
000000000181AF38 E843B7C5FF      call TdxTrackBarRange.SetMin
VCL.Color.Frame.pas.124: trackbarHelligkeit.Range.Max := round( (ccLumDelta+ccIdleReduce) * 100);
000000000181AF3D 488B053C63AB00   mov rax,[rel $00ab633c]
000000000181AF44 F3480F5A00       cvtss2sd xmm0,qword ptr [rax]
000000000181AF49 488B05D0C7AB00   mov rax,[rel $00abc7d0]
000000000181AF50 F3480F5A08       cvtss2sd xmm1,qword ptr [rax]
000000000181AF55 F20F58C1         addsd xmm0,xmm1
000000000181AF59 F20F590517010000 mulsd xmm0,qword ptr [rel $00000117]
000000000181AF61 E82A15BFFE      call @Round
000000000181AF66 488B4D60         mov rcx,[rbp+$60]
000000000181AF6A 488B8900050000   mov rcx,[rcx+$00000500]
000000000181AF71 488B89A0080000   mov rcx,[rcx+$000008a0]
000000000181AF78 89C2             mov edx,eax
000000000181AF7A E8E1B6C5FF      call TdxTrackBarRange.SetMax
VCL.Color.Frame.pas.141: btnAkzent.Down := True;
000000000181AF7F 488B4560         mov rax,[rbp+$60]
000000000181AF83 488B88A0060000   mov rcx,[rax+$000006a0]
000000000181AF8A B201             mov dl,$01
000000000181AF8C E82F866CFF      call TscCustomButtonControl.SetDown
VCL.Color.Frame.pas.142: btnAkzentClick( nil);
000000000181AF91 488B4D60         mov rcx,[rbp+$60]
000000000181AF95 33D2             xor edx,edx
000000000181AF97 E804020000       call TfrColorSettings.btnAkzentClick
VCL.Color.Frame.pas.144: LStylename := TStyleManager.ActiveStyle.Name;
000000000181AF9C E86FE2F3FE      call TStyleManager.GetActiveStyle
000000000181AFA1 4889C1           mov rcx,rax
000000000181AFA4 488D5538         lea rdx,[rbp+$38]
000000000181AFA8 488B18           mov rbx,[rax]
000000000181AFAB FF93A0000000     call qword ptr [rbx+$000000a0]
VCL.Color.Frame.pas.145: if SetVCLStyle( LStylename, ccColormode) <> '(dummy)' then // um den Stylenamen (var) zu bereinigen
000000000181AFB1 488D4D20         lea rcx,[rbp+$20]
000000000181AFB5 488D5538         lea rdx,[rbp+$38]
000000000181AFB9 488B0588B3AB00   mov rax,[rel $00abb388]
000000000181AFC0 4C0FB600         movzx r8,byte ptr [rax]
000000000181AFC4 E897DFFFFF      call SetVCLStyle
000000000181AFC9 488B4D20         mov rcx,[rbp+$20]
000000000181AFCD 488D1500010000   lea rdx,[rel $00000100]
000000000181AFD4 E86787BFFE      call @UStrEqual
000000000181AFD9 85C0             test eax,eax
000000000181AFDB 7414             jz TfrColorSettings.Init + $131
VCL.Color.Frame.pas.146: lblCurrentStylename.Caption := LStylename;   // ohne if-Abfrage macht der Compiler Mist
000000000181AFDD 488B4560         mov rax,[rbp+$60]
000000000181AFE1 488B8888060000   mov rcx,[rax+$00000688]
000000000181AFE8 488B5538         mov rdx,[rbp+$38]
000000000181AFEC E84FA7E2FE      call TControl.SetText
CPU OHNE if-Anweisung
Code:
VCL.Color.Frame.pas.120: try
000000000181AEF0 90               nop
VCL.Color.Frame.pas.145: {if} SetVCLStyle( LStylename, ccColormode);// <> '(dummy)' then // um den Stylenamen (var) zu bereinigen
000000000181AEF1 48C7453800000000 mov qword ptr [rbp+$38],$0000000000000000
VCL.Color.Frame.pas.121: FOnColorChanged := nil;
000000000181AEF9 90               nop
000000000181AEFA 488B4560         mov rax,[rbp+$60]
000000000181AEFE 488D80E0060000   lea rax,[rax+$000006e0]
000000000181AF05 48C70000000000   mov qword ptr [rax],$0000000000000000
000000000181AF0C 48C7400800000000 mov qword ptr [rax+$08],$0000000000000000
VCL.Color.Frame.pas.123: trackbarHelligkeit.Range.Min := round( ccLumDelta * 100);
000000000181AF14 488B057563AB00   mov rax,[rel $00ab6375]
000000000181AF1B F3480F5A00       cvtss2sd xmm0,qword ptr [rax]
000000000181AF20 F20F590548010000 mulsd xmm0,qword ptr [rel $00000148]
000000000181AF28 E86315BFFE      call @Round
000000000181AF2D 488B4D60         mov rcx,[rbp+$60]
000000000181AF31 488B8900050000   mov rcx,[rcx+$00000500]
000000000181AF38 488B89A0080000   mov rcx,[rcx+$000008a0]
000000000181AF3F 89C2             mov edx,eax
000000000181AF41 E83AB7C5FF      call TdxTrackBarRange.SetMin
VCL.Color.Frame.pas.124: trackbarHelligkeit.Range.Max := round( (ccLumDelta+ccIdleReduce) * 100);
000000000181AF46 488B054363AB00   mov rax,[rel $00ab6343]
000000000181AF4D F3480F5A00       cvtss2sd xmm0,qword ptr [rax]
000000000181AF52 488B05D7C7AB00   mov rax,[rel $00abc7d7]
000000000181AF59 F3480F5A08       cvtss2sd xmm1,qword ptr [rax]
000000000181AF5E F20F58C1         addsd xmm0,xmm1
000000000181AF62 F20F590506010000 mulsd xmm0,qword ptr [rel $00000106]
000000000181AF6A E82115BFFE      call @Round
000000000181AF6F 488B4D60         mov rcx,[rbp+$60]
000000000181AF73 488B8900050000   mov rcx,[rcx+$00000500]
000000000181AF7A 488B89A0080000   mov rcx,[rcx+$000008a0]
000000000181AF81 89C2             mov edx,eax
000000000181AF83 E8D8B6C5FF      call TdxTrackBarRange.SetMax
VCL.Color.Frame.pas.141: btnAkzent.Down := True;
000000000181AF88 488B4560         mov rax,[rbp+$60]
000000000181AF8C 488B88A0060000   mov rcx,[rax+$000006a0]
000000000181AF93 B201             mov dl,$01
000000000181AF95 E826866CFF      call TscCustomButtonControl.SetDown
VCL.Color.Frame.pas.142: btnAkzentClick( nil);
000000000181AF9A 488B4D60         mov rcx,[rbp+$60]
000000000181AF9E 33D2             xor edx,edx
000000000181AFA0 E8EB010000       call TfrColorSettings.btnAkzentClick
VCL.Color.Frame.pas.144: LStylename := TStyleManager.ActiveStyle.Name;
000000000181AFA5 E866E2F3FE      call TStyleManager.GetActiveStyle
000000000181AFAA 4889C1           mov rcx,rax
000000000181AFAD 488D5530         lea rdx,[rbp+$30]
000000000181AFB1 488B18           mov rbx,[rax]
000000000181AFB4 FF93A0000000     call qword ptr [rbx+$000000a0]
VCL.Color.Frame.pas.145: {if} SetVCLStyle( LStylename, ccColormode);// <> '(dummy)' then // um den Stylenamen (var) zu bereinigen
000000000181AFBA 488D4D38         lea rcx,[rbp+$38]
000000000181AFBE 488D5530         lea rdx,[rbp+$30]
000000000181AFC2 488B058FB3AB00   mov rax,[rel $00abb38f]
000000000181AFC9 4C0FB600         movzx r8,byte ptr [rax]
000000000181AFCD E88EDFFFFF      call SetVCLStyle
VCL.Color.Frame.pas.146: lblCurrentStylename.Caption := LStylename;   // ohne if-Abfrage macht der Compiler Mist
000000000181AFD2 488B4560         mov rax,[rbp+$60]
000000000181AFD6 488B8888060000   mov rcx,[rax+$00000688]
000000000181AFDD 488B5530         mov rdx,[rbp+$30]
000000000181AFE1 E85AA7E2FE      call TControl.SetText


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