![]() |
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:
Wichtig ist die Zeile
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; 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:
Also es wird erst die Funktion gestartet und später erst die Variable initialisiert.
FInInit := True;
try SetVCLStyle( ... Was ist das? |
AW: Compiler Problem Reihenfolge der Ausführung
Ist das unter 32-Bit kompiliert auch so?
|
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.
|
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.
|
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. |
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:
In Win32 wurde erst Global geprüft und dann Test ausgeführt,
var Global: Integer;
funktion Test(var i: Integer): Boolean; begin Global := i; Result := irgendwas; end; if (Global = 0) and Test(i) then 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) |
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?
|
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. |
AW: Compiler Problem Reihenfolge der Ausführung
Zitat:
Code:
einem Aufruf von SetVclStyle entspricht.
mov qword ptr [rbp+$38], $0000000000000000
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. |
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:
CPU mit der if-Anweisung
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
Code:
CPU OHNE if-Anweisung
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
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 23:39 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