Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.227 Beiträge
 
Delphi 12 Athens
 
#11

Re: Pointer to String; String to Pointer

  Alt 29. Apr 2009, 15:45
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 )

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:
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)^;
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
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}
...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat