AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

const String als Parameter

Ein Thema von Sergej_Molotov · begonnen am 19. Nov 2015 · letzter Beitrag vom 20. Nov 2015
Antwort Antwort
Sergej_Molotov

Registriert seit: 18. Jul 2006
59 Beiträge
 
Delphi 10.3 Rio
 
#1

const String als Parameter

  Alt 19. Nov 2015, 16:03
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#2

AW: const String als Parameter

  Alt 19. Nov 2015, 16:57
Du bist sicher, daß das unter XE3 funktioniert?
Von D7 bis XE gibt das auf jeden Fall Ärger!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.689 Beiträge
 
Delphi 2007 Professional
 
#3

AW: const String als Parameter

  Alt 19. Nov 2015, 17:10
Unter D2007 funktioniert's bei mir wie für XE3 beschrieben, also 2 MessageBoxen ohne Exception. In der Zeile 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.
Uli Gerhardt

Geändert von uligerhardt (19. Nov 2015 um 17:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#4

AW: const String als Parameter

  Alt 19. Nov 2015, 17:16
Könntest du kurz erklären warum das nicht funktioniert? Unter XE4 bekomme ich keine Exception, aber eine MessageBox ohne Inhalt.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.020 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: const String als Parameter

  Alt 19. Nov 2015, 17:31
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...
  Mit Zitat antworten Zitat
Sergej_Molotov

Registriert seit: 18. Jul 2006
59 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: const String als Parameter

  Alt 20. Nov 2015, 11:35
@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

Memo1.Lines.Add(aString); PS: Ja ich bin sicher, dass es unter XE3 funktioniert
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 01:02 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