Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriff auf String^ (String pointer) (https://www.delphipraxis.net/191756-zugriff-auf-string%5E-string-pointer.html)

Pixel 16. Feb 2017 13:20

Delphi-Version: 5

Zugriff auf String^ (String pointer)
 
Hallo,

nehmen wir folgenden Code an:

Delphi-Quellcode:
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!

Neutral General 16. Feb 2017 13:25

AW: Zugriff auf String^ (String pointer)
 
Delphi-Quellcode:
NormalerString := 'Hallo Welt!';
PointerString := @NormalerString;
ShowMessage(PointerString^);
Einfach so.

mkinzler 16. Feb 2017 13:26

AW: Zugriff auf String^ (String pointer)
 
Was hast Du vor?

Pixel 16. Feb 2017 13:32

AW: Zugriff auf String^ (String pointer)
 
Zitat:

Zitat von Neutral General (Beitrag 1361812)
Delphi-Quellcode:
NormalerString := 'Hallo Welt!';
PointerString := @NormalerString;
ShowMessage(PointerString^);
Einfach so.

Ich möchte aber nicht den gesamten String in PointerString,

Zitat:

Zitat von mkinzler (Beitrag 1361814)
Was hast Du vor?

sondern eben ab NormalerString + 5! Ich möchte dass PointerString auf den NormalerString zeigt, und zwar auf die Stelle 5 (das klappt ja auch soweit, hab die Adressen geprüft). Nur der Zugriff, der klappt nicht.

Neutral General 16. Feb 2017 13:37

AW: Zugriff auf String^ (String pointer)
 
Delphi-Quellcode:
var
  NormalerString : String;
  PointerString : PChar;
.
.
NormalerString := 'Hallo Welt!';
PointerString := @NormalerString[5];
ShowMessage(PointerString);
Sollte so gehen.

Pixel 16. Feb 2017 13:39

AW: Zugriff auf String^ (String pointer)
 
Zitat:

Zitat von Neutral General (Beitrag 1361819)
Delphi-Quellcode:
var
  NormalerString : String;
  PointerString : PChar;
.
.
NormalerString := 'Hallo Welt!';
PointerString := @NormalerString[5];
ShowMessage(PointerString);
Sollte so gehen.

Ja geht, danke.

Warum geht mein code nicht?

Ich caste die Adresse von NormalerString doch als Integer, addiere 5 drauf, Caste das wieder als Pointer und weise es einem Pointe rzu, warum ist das falsch?

Neutral General 16. Feb 2017 13:41

AW: Zugriff auf String^ (String pointer)
 
Weil ein String an Stelle [0] die Länge gespeichert hat und ich glaube davor sogar noch ein paar Informationen.
Wenn du einen String-Pointer einfach um 5 nach hinten verschiebst gibt es diese Informationen davor nicht, weil davor ja die anderen Buchstaben stehen.
Außerdem ist ein String schon ein Pointer. Wenn du @StringVariable schreibst ist das ein Pointer auf den String-Pointer. Und wenn du den verschiebst landest du irgendwo im Nirvana.

Pixel 16. Feb 2017 13:42

AW: Zugriff auf String^ (String pointer)
 
// EDit: nvm

Neutral General 16. Feb 2017 13:43

AW: Zugriff auf String^ (String pointer)
 
Lies den 2. Teil meiner Antwort.
=>
Delphi-Quellcode:
var
  NormalerString : String;
  PointerString : PChar;
begin
  NormalerString := 'Hallo Welt!';
  PointerString := PChar(Integer(NormalerString) + 5);
  ShowMessage(PointerString);
Das ist aber deutlich gefährlicher in Hinblick auf Unicode strings ab Delphi 2009.

p80286 16. Feb 2017 13:59

AW: Zugriff auf String^ (String pointer)
 
Zitat:

Zitat von Neutral General (Beitrag 1361822)
Außerdem ist ein String schon ein Pointer.

Nicht notwendiger Weise, aber mit
Delphi-Quellcode:
pteilstr:=@Mystring[5];
sollte man immer auf der sicheren Seite sein.

Bei Arrays ist's übrigens genauso.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Seite 1 von 2  1 2   

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