![]() |
Re: Pointer to String; String to Pointer
das UniqueString wird nur aufgerufen, damit der String einmalig ist (also Referenzzähler = 1), wenn man eventuell mal schreibend auf den String zugreift (wann man da nur lesen will und dazu keine "zeitgraubenden" Sicherungsmaßnahmen seitens Delphi haben will, dann muß man da schon etwas rumtricksen :nerd: )
Aber der Grund, warum dort eine Exception auftritt ist: der Zeiger auf die Stringdaten wird sozusagen erst derefferenziert und dann um den Index zum Zeichen erhöht. Da ein Leerstring intern nunmal NIL ist, man NIL so schlecht dereferenzieren kann ... *peng* PS: wenn man bei einem 2 Zeichen langem String auf S[3] zugreift, dann schlägt dort maximal die Bereichsprüfung zu, wenn diese mit einkompiliert wurde.
Delphi-Quellcode:
und hier der Grund, warum es kein NIL Problem gibt ... sind keine Stringdaten vorhanden, dann wird bei PChar(S) auf einen existierenden Speicher verwiesen, wo nur #0 drinsteht
P := PChar(S); // P := LStrToPChar(S_var);
P := @S[3]; // UniqueString(S_var); // oder in Kurz: // P := @(Pointer(S_var) + 2)^; // P := @(Pointer(UniqueString(S_var)) + 2)^;
Delphi-Quellcode:
function _LStrToPChar(const s: AnsiString): PChar;
{$IFDEF PUREPASCAL} const EmptyString = ''; begin if Pointer(s) = nil then Result := EmptyString else Result := Pointer(s); end; {$ELSE} ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 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