Zugriff auf String^ (Stringpointer)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Lyan
Beiträge: 5
Registriert: So 12. Feb 2017, 15:00

Zugriff auf String^ (Stringpointer)

Beitrag von Lyan »

Hallo,

Nehmen wir folgenden Code an:

Code: Alles auswählen

 
var
  NormalerString : String;
  PointerString : ^String;
.
.
NormalerString := 'Hallo Welt!';
PointerString := Pointer(Integer(@NormalerString) + 5);
ShowMessage(String(PointerString^));
 


Da gibt's eine Fehlermeldung, ich schätze das mit den Pointern habe ich nicht so ganz verstanden in FP.
Kann mir das bitte einer erklären? Danke!

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Zugriff auf String^ (Stringpointer)

Beitrag von siro »

Code: Alles auswählen

  NormalerString := 'Hallo Welt!';
  PointerString  := @NormalerString;    { zeigt nun auf den Speicher von Normalerstring }
  ShowMessage(PointerString^);
 


PointerString ist nur ein Zeiger auf einen Speicher.
Also muss man dem Zeiger sagen wohin er zeigen soll mit
PointerString := @NormalerString;

Nehmen wir an, dein NormalerString steht an der Speicherstelle 1000
dann sagst Du dem Pointerstring guck mal auf die Speicherstelle 1000
Du weist ihm quasi eine Adresse zu, deshalb der Adressoperator @

Dann gibt man den Text aus worauf der Zeigt mit:
ShowMessage(PointerString^);

Zeige den Text worauf der Zeiger zeigt. Deshalb das ^ damit ist immer der Inhalt gemeint, also das worauf er zeigt.
Oder anders ausgedrückt: Gebe den Text aus, der an Speicherstelle 1000 steht.

Siro
Zuletzt geändert von siro am Do 16. Feb 2017, 13:43, insgesamt 1-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Zugriff auf String^ (Stringpointer)

Beitrag von Jole »

Wenn man von NormalerString keine Zeiger Kopie haben will geht das auch so:

Code: Alles auswählen

  NormalerString := 'Hallo Welt!';
  New (PointerString);              // muss initialisiert werden
  PointerString^ := NormalerString; // string copieren
  ShowMessage (PointerString^);
  Dispose (PointerString);          // wieder frei geben
 

Lyan
Beiträge: 5
Registriert: So 12. Feb 2017, 15:00

Re: Zugriff auf String^ (Stringpointer)

Beitrag von Lyan »

Hab auf einem anderen Forum die gleiche Frage gestellt und Neutral General hat mir eine passende Antwort gegeben, daher hab ich gelernt:

Code: Alles auswählen

 
@String = Adresse die Auf String zeigt
String[0] = Länge von String
String[1] = Erster Char
@String[1] = Adresse von erstem Char
 
=>
 
Entweder PChar(@NormalerString[1] + 4);
 
oder (einfacher, besser)
 
@NormalerString[5];
 


Mein Fehler war, dass String ja schon ein Pointer ist und ich demnach den Pointer, der auf den String zeigt mit @NormalerString + 5 erhöht habe. Demnach war ich im Nirvana gelandet.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zugriff auf String^ (Stringpointer)

Beitrag von mse »

Lyan hat geschrieben:

Code: Alles auswählen

 
String[0] = Länge von String
 


Das gilt nur für Shortstring z.B.

Code: Alles auswählen

 
var
 str1: string[20];
 

und die sind keine Pointer.
http://www.freepascal.org/docs-html/cur ... 370003.2.4

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Zugriff auf String^ (Stringpointer)

Beitrag von Jole »

Lyan hat geschrieben:Hab auf einem anderen Forum die gleiche Frage gestellt und Neutral General hat mir eine passende Antwort gegeben, daher hab ich gelernt:

Wäre nett wenn in solch einem Fall ein Link auf das andere Forenthema gesetzt werden würde (gilt für das andere Forum genauso), dann wüste man ob man sich noch den Kopf zerbrechen muss oder nicht.

Antworten