Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer(MyString)^ vs MyString[1] ? (https://www.delphipraxis.net/30668-pointer-mystring-%5E-vs-mystring%5B1%5D.html)

Dani 27. Sep 2004 19:28


Pointer(MyString)^ vs MyString[1] ?
 
Hi!

Ist es egal, welches dieser beiden Kontrukte ich benutze oder gibt es irgendwelche Risiken bei MyString[1]?

Beispiel:

Delphi-Quellcode:
procedure foo;
var FS: TFileStream;
     s: String;
begin
 s := 'Delphi-PRAXiS';
 FS := TFileStream.Create('C:\foo.str', fmCreate or fmShareExclusive);
 FS.Write(s[1], Length(s));
 FS.Write(Pointer(s)^, Length(s));
end;
Gruß,
Dani

NicoDE 27. Sep 2004 19:42

Re: Pointer(MyString)^ vs MyString[1] ?
 
Beide Varianten sind nicht sonderlich sicher. Am 'besten' ist ein Cast auf PChar.

Dani 27. Sep 2004 20:09

Re: Pointer(MyString)^ vs MyString[1] ?
 
Hmm, was genau kann da denn schiefgehen? Die Pointer(s)^ - Methode wird z.B. in den Borland VCL-Sourcen benutzt...

Robert Marquardt 28. Sep 2004 06:22

Re: Pointer(MyString)^ vs MyString[1] ?
 
PChar() ist kein Typecast sondern eine Funktion.
Der Leerstring in Delphi wird naemlich durch nil dargestellt.
PChar() stellt sicher das in diesem Fall ein C-Leerstring vorhanden ist.
Zusatzlich wird oft auch noch ein UniqueString aufgerufen, um sicherzustellen das
ein schreibfaehiger String vorhanden ist.
Die Aufrufe in den Delphi-Sourcen sind also wahrscheinlich aus Effizienzgruenden mit Pointer realisiert.
Es sollten entsprechend Sicherheitschecks gemacht werden.

Motzi 28. Sep 2004 17:51

Re: Pointer(MyString)^ vs MyString[1] ?
 
Auf alle 3 Arten einen String nach PChar zu casten gehe ich in meinem String-Tutorial unter www.manuel-poeter.de ein und zeig welche Hintergrundarbeiten Delphi dabei erledigt...

tommie-lie 28. Sep 2004 18:51

Re: Pointer(MyString)^ vs MyString[1] ?
 
Zitat:

Zitat von Robert Marquardt
PChar() ist kein Typecast sondern eine Funktion.

Hm? Ich würde das ja eher Compiler Magic nennen :gruebel:


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