Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   const String als Parameter (https://www.delphipraxis.net/187323-const-string-als-parameter.html)

Sergej_Molotov 19. Nov 2015 16:03

const String als Parameter
 
Hallo Zusammen,

vielleicht hat ja jemand eine Erklärung, warum es unterschiede in Delphi XE3 und Delphi XE8 bei der Verwendung von konstanten String Parameter gibt. Folgendes Code-Beispiel funktioniert unter XE3 und löst unter XE8 eine EInvalidPointer-Exception aus.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  FTest := 'Ich bin ein Test';
  MachWas(FTest);
  ShowMessage(FTest); // Ausgabe 'Ich bin ein Test hurz' nur bei XE3 wegen der u.g. Exception
end;


procedure TForm1.MachWas(const aString: String);
begin
  FTest := aString + ' hurz';
  ShowMessage(aString); // Exception in Delphi XE8 und unter XE3 erscheint die MessageBox mit 'Ich bin ein Test'
end;
Es ist natürlich klar, dass der Pointer von 'FTest' durch die Zuweisung in 'MachWas' geändert wird, mich irritiert nur das unterschiedliche Verhalten bei gleichen Compiler-Einstellungen

p80286 19. Nov 2015 16:57

AW: const String als Parameter
 
Du bist sicher, daß das unter XE3 funktioniert?
Von D7 bis XE gibt das auf jeden Fall Ärger!

Gruß
K-H

uligerhardt 19. Nov 2015 17:10

AW: const String als Parameter
 
Unter D2007 funktioniert's bei mir wie für XE3 beschrieben, also 2 MessageBoxen ohne Exception. In der Zeile
Delphi-Quellcode:
FTest := aString + ' hurz';
ändert sich Pointer(FTest), während Pointer(AString) gleich bleibt. Scheinbar wurde in LStrCat3 (was laut CPU-Ansicht aufgerufen wird) Parameter-Aliassing (oder wie das jetzt heißt) berücksichtigt. Vielleicht ist das der großen Unicode-Transmogrifikation zum Opfer gefallen... aber, wenn's beim OP unter XE3 auch läuft, eher nicht.

Edit: Unter XE6 funzt's auch.

Captnemo 19. Nov 2015 17:16

AW: const String als Parameter
 
Könntest du kurz erklären warum das nicht funktioniert? Unter XE4 bekomme ich keine Exception, aber eine MessageBox ohne Inhalt.

Mavarik 19. Nov 2015 17:31

AW: const String als Parameter
 
Ich bekomme unter D10 auch eine Exception und den Text in "Schriftzeichen" angezeigt...

Fehler liegt aber scheinbar im Sendmessage den ein:

Delphi-Quellcode:
procedure TForm108.Button1Click(Sender: TObject);
begin
   FTest := 'Ich bin ein Test';
   MachWas(FTest);
   Memo1.Lines.Add(FTest);
//   ShowMessage(FTest); // Ausgabe 'Ich bin ein Test hurz' nur bei XE3 wegen der u.g. Exception
end;

procedure TForm108.MachWas(const aString: String);
begin
   FTest := aString + ' hurz';
   Memo1.Lines.Add(Ftest);
//   ShowMessage(aString); // Exception in Delphi XE8 und unter XE3 erscheint die MessageBox mit 'Ich bin ein Test'
end;
Gibt keine Exception und bringt die erwarteten Texte...

Sergej_Molotov 20. Nov 2015 11:35

AW: const String als Parameter
 
@Mavarik

Du hast in dein Memo "Ftest" reingepackt und nicht "aString". Stürzt des ab, wenn du aString verwendest?

Zitat:

Memo1.Lines.Add(Ftest);
ändern nach

Delphi-Quellcode:
Memo1.Lines.Add(aString);
PS: Ja ich bin sicher, dass es unter XE3 funktioniert


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf