Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CopyFileEx und Codeoptimierung XE5 (https://www.delphipraxis.net/179923-copyfileex-und-codeoptimierung-xe5.html)

wurzelzwerg 11. Apr 2014 09:42

AW: CopyFileEx und Codeoptimierung XE5
 
Deine Version geht.

Das fliegt raus:

Delphi-Quellcode:
var
  Cancelled: Boolean;
begin
  if not CopyFileEx('d:\Neues Textdokument.txt',
      'd:\Neues Textdokument (Kopie).txt',
      nil, nil, @Cancelled,
      COPY_FILE_NO_BUFFERING
   )
   then RaiseLastOSError();
Jetzt komischerweise unabhängig von Code-Optimierung, also immer.
:o

Im ursprünglichen Programm muss das @Cancelled raus und nil rein dann gehts auch dort.
Nur Warum?

Uwe Raabe 11. Apr 2014 09:49

AW: CopyFileEx und Codeoptimierung XE5
 
Die lokale Variable
Delphi-Quellcode:
Cancelled
wird nicht implizit initialisiert. Wenn da zufällig
Delphi-Quellcode:
true
drin steht, würde das
Delphi-Quellcode:
CopyFileEx
abbrechen. Selbst wenn du die vorher auf
Delphi-Quellcode:
false
setzt, wird der Compiler den Aufruf wegoptimieren, da die Variable später nicht ausgelesen wird. Offenbar wird die Übergabe an
Delphi-Quellcode:
CopyFileEx
über den Adressoperator nicht als Verwendung angesehen.

Versuch doch mal einfach nach dem
Delphi-Quellcode:
CopyFileEx
noch eine Abfrage auf
Delphi-Quellcode:
Cancelled
zu machen (natürlich so, daß die nicht auch noch wegoptimiert wird).

Der schöne Günther 11. Apr 2014 09:56

AW: CopyFileEx und Codeoptimierung XE5
 
Vielleicht würde
Delphi-Quellcode:
Addr(Cancelled)
statt
Delphi-Quellcode:
@Cancelled
einen Unterschied bzgl. Optimierung machen? (Ich rate nur wild)

himitsu 11. Apr 2014 10:07

AW: CopyFileEx und Codeoptimierung XE5
 
Ob und welches
Delphi-Quellcode:
Cancelled := False;
wegoptimiert wurde, müsste man nach dem Compilieren eigentlich sehen (die blauen Pünktchen) und auch der Debugger würde die Befehle entsprechend überspringen.

Zitat:

Zitat von Uwe Raabe (Beitrag 1255312)
(natürlich so, daß die nicht auch noch wegoptimiert wird).

Ist der Compiler eigentlich inzwischen so intelligent, daß er auch leere IFs erkennt?
Oder optimiert er
Delphi-Quellcode:
if Cancelled then ;
immernoch nicht weg? :angel:

wurzelzwerg 11. Apr 2014 10:08

AW: CopyFileEx und Codeoptimierung XE5
 
Hilft beides nicht.
Cancelled ist davor und danach false und CopyFileEx fliegt raus.

Delphi-Quellcode:
var
  Cancelled: Boolean;
begin
  Cancelled:= false;
  if not CopyFileEx('d:\Neues Textdokument.txt',
      'd:\Neues Textdokument (Kopie).txt',
      nil, nil, @Cancelled,
      COPY_FILE_NO_BUFFERING
   )
   then RaiseLastOSError();
   if Cancelled then
     beep;

Union 11. Apr 2014 10:46

AW: CopyFileEx und Codeoptimierung XE5
 
Delphi-Quellcode:
if CompilerVer > D2009 then LongBool <> Boolean;

DeddyH 11. Apr 2014 10:56

AW: CopyFileEx und Codeoptimierung XE5
 
War Boolean nicht immer schon ByteBool?

Union 11. Apr 2014 11:14

AW: CopyFileEx und Codeoptimierung XE5
 
Ja ;) Aber in diesem Fall liegt es an den Variablen. Bei ausgeschalteter Optimierung belegt wohl das boolean eine Registerbreite. Ist sie angeschaltet dann wird nur noch ein Byte belegt. Jetzt wird ein Pointer auf die Adresse des boolean an die CopyFileEx übergeben. Dieses ist der festen Überzeugung das es 4 byte lesen muss und darf. Damit hängt der Inhalt aus Sicht der WinApi davon ab, was dahinter gerade so zufällig an den nächsten 3 byte im Speicher steht.

wurzelzwerg 11. Apr 2014 11:28

AW: CopyFileEx und Codeoptimierung XE5
 
Danke, das wars. Mit LongBool gehts.

Christian Seehase 11. Apr 2014 11:35

AW: CopyFileEx und Codeoptimierung XE5
 
Zitat:

Zitat von DeddyH (Beitrag 1255321)
War Boolean nicht immer schon ByteBool?

Bis D7 zurück auf jeden Fall.
(kleiner kann ich im moment nicht prüfen ;-))


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Seite 2 von 3     12 3      

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