Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pointer to String; String to Pointer (https://www.delphipraxis.net/133299-pointer-string%3B-string-pointer.html)

Rakogan 29. Apr 2009 12:51


Pointer to String; String to Pointer
 
Hi,
ist es möglich einen Pointer als String zu Speichern und andersherum einen String wieder zu einem Pointer zu "machen"?
Generell ist ein Pointer ja nur ein Zeiger der auf etwas Zeigt, was meiner meinung nach die Sache erschwert, da man einen String nicht einfach mit so zuweisen kann:
Delphi-Quellcode:
var
  s:String;
  p:pointer;
begin
  p:=pointer(s);
end;
Dadurch würde ja der Pointer auf den String zeigen und nicht auf den Pointer der als String gespeichert ist.

Rakogan

Phoenix 29. Apr 2009 12:53

Re: Pointer to String; String to Pointer
 
Das Stichwort ist Delphi-Referenz durchsuchenPChar. ;-)

Satty67 29. Apr 2009 12:53

Re: Pointer to String; String to Pointer
 
Delphi-Quellcode:
var
  s:String;
  p:pointer;
begin
  p := @s[1];
  // oder
  p := PChar(s);
  // zurück mit
  s := PChar(p);
end;

himitsu 29. Apr 2009 12:55

Re: Pointer to String; String to Pointer
 
hallo ersmal :hi:

der offizielle Weg wäre
Delphi-Quellcode:
P := PChar(S);

aber es kommt drauf an, was du vor hast ... soll der Pointer auf den String zeigen
oder soll hinter dem Pointer eine eigene Kopie des Strings liegen
und wenn Letzeres, worüber willst du den Speicher für die Stringdaten im Pointer reservieren?

[edit]
@satty1:
Delphi-Quellcode:
p := @s[1];
aber paß auf ... wenn der String leer ist, dann knallt es hier gewaltig, da es kein Zeichen am Index 1 gibt :zwinker:

p80286 29. Apr 2009 13:01

Re: Pointer to String; String to Pointer
 
Hallo

ich interpretiere die Frage so, daß Rakogan gerne den "wert" eines Pointers ausgeben will, etwa so:
Zeiger auf wertx: 0x012DA4E34

das liefe dann auf InttoHex oder InttoStr hinaus.

Gruß
K-H

Satty67 29. Apr 2009 13:08

Re: Pointer to String; String to Pointer
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
p := @s[1];

Ja, sorry... schneller getippt als nachgedacht ;-)
Zitat:

aber paß auf ... wenn der String leer ist, dann knallt es hier gewaltig, da es kein Zeichen am Index 1 gibt :zwinker:
Garnicht wahr, erst bei p := @s[2]; :stupid: zwei #0 auch bei leeren Strings oder Speicherausrichtung schützt mich da irgendwie Nicht nachmachen!

Aber ist trotzdem falsch und PChar sowieso der richtigere Cast.

himitsu 29. Apr 2009 13:11

Re: Pointer to String; String to Pointer
 
Zitat:

Delphi-Quellcode:
P := PChar(S);
// zurück mit
S := PChar(P);

wobei hier P:=PChar(s); das P nur auf den Anfang von S zeigt
und wenn man S mal ändert, dann könnte P auch mal schnell ins (n)Irgendwo hinzeigen

hier S:=PChar(P); wird aber der Text, auf welchen P zeigt kopiert und die Kopie in S abgespeichert.


wenn zu z.B. eine eigene Kopie in P anlegen willst ... wobei es da auch noch viele andere Wege gibt, welche teilweise sogar noch direkt auf Strings/Texte ausgelegt sind (die fallen mir aber grad nicht ein, da ich sie nicht nutze)
Delphi-Quellcode:
P := GetMem(Length(S) + 1);
MoveMemory(P, PChar(S), Length(S) + 1);

// und wenn man den Speicher/Text von P nicht mehr braucht,
// dann muß man den natürlich wieder freigeben
FreeMem(P);
Zitat:

Garnicht wahr, erst bei p := @s[3]; :stupid:
ich hoffe der Threadersteller und alle Anderen lesen hier die Ironi raus :angel2:

Rakogan 29. Apr 2009 14:27

Re: Pointer to String; String to Pointer
 
Danke für die ganzen Hilfen
ich hab es jetzt ganz simpel gelöst^^
Pointer auslesen:
Delphi-Quellcode:
var
  s:String;
  p:pointer;
begin
  s:=inttostr(integer(p));
end;
Pointer zuweisen:
Delphi-Quellcode:
var
  s:String;
  p:pointer;
begin
  p:=pointer(strtoint(s));
end;
Für Kommentare und Anregungen dazu bin ich immer offen ;-)

himitsu 29. Apr 2009 14:37

Re: Pointer to String; String to Pointer
 
also so wandelst du nur den Pointer selber in einen String(bzw. den binären Zeigerwet in einen dezumalen String)


was willst du denn nun erreichen/machen?

Satty67 29. Apr 2009 15:29

Re: Pointer to String; String to Pointer
 
ich glaube p80286 hatte recht... :roll:

***

dann, weil es mich interessiert hat:
Delphi-Quellcode:
S := '';

P := PChar(S);
//mov eax,[ebp-$04]
//call @LStrToPChar

P := @S[1];
//lea eax,[ebp-$04]
//call UniqueString
Deshalb gibt es auch bei leerem String wohl keine AV.
Trotzdem, auf @S[1] zugreifen ohne eine Gültigkeitsprüfung ist schlechter Code und soll nicht zur Nachahmung dienen. Ich wollte nur wissen, warum es ging!

himitsu 29. Apr 2009 15:45

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:
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}
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.

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