Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pointer zu String? (https://www.delphipraxis.net/150024-pointer-zu-string.html)

Teekeks 5. Apr 2010 19:37


Pointer zu String?
 
Hallo!
Ich würde gerne ein Pointer zu einem String Casten.
Also der Pointer (untypisiert) zeigt auf eine vorhandene Stringvariable aber wenn ich folgendes mache:
Delphi-Quellcode:
par:=String(aValue^);
kommt ein Leerstring bei raus. Woran mag das liegen?

Gruß Teekeks

Neutral General 5. Apr 2010 19:38

Re: Pointer zu String?
 
Hi,

Versuchs mal so:

Delphi-Quellcode:
par := PString(aValue)^;
Gruß
Neutral General

himitsu 5. Apr 2010 19:47

Re: Pointer zu String?
 
Zitat:

Zitat von Neutral General
Versuchs mal so:

bei einem untypisiertem Pointer macht dieses keinen Unterschied.

Zitat:

Also der Pointer (untypisiert) zeigt auf eine vorhandene Stringvariable
und wie machst du das?

Teekeks 5. Apr 2010 19:49

Re: Pointer zu String?
 
das mach ich so:
Delphi-Quellcode:
Value:=@stra[High(stra)];
Edit:
achso, oben ist par ein string...

mkinzler 5. Apr 2010 19:49

Re: Pointer zu String?
 
Eine Stringvariable ist ja auch ein Zeiger

Teekeks 5. Apr 2010 19:51

Re: Pointer zu String?
 
das heißt?
Edit (arrg)
wie soll ich das sonst machen?

Namenloser 5. Apr 2010 19:51

Re: Pointer zu String?
 
Was für ein Pointer liegt denn vor? Wenn du den Pointer von irgendeiner API bekommst, zeigt er vermutlich auf das erste Element des Strings, nicht auf den String selber. Den Pointer müsstest du in diesem Fall als PAnsiChar deklarieren. Den kannst du dann einem String ohne Probleme zuweisen - der Compiler regelt das automatisch.

Neutral General 5. Apr 2010 19:51

Re: Pointer zu String?
 
Ich schätze mal die beiden Zeilen

Delphi-Quellcode:
Value:=@stra[High(stra)];
und

Delphi-Quellcode:
par:=String(aValue^);
stehen in 2 unterschiedlichen Methoden und stra ist ein lokales Array of String?

himitsu 5. Apr 2010 19:52

Re: Pointer zu String?
 
Das ist aber ein Zeiger auf das letzte Zeichen und kein Zeiger auf einen Delphi-String.

Code:
[s]par := Char(aValue^);
// oder
par := PChar(aValue)^; // "kein" Zeiger auf einen PChar-String, sondern auf ein Char[/s]
[edit]
wenn "stra" ein String :oops:


Delphi-Quellcode:
Value:=Pointer(stra[High(stra)]);
par:=String(aValue);



Value:=@stra[High(stra)];
par:=String(aValue^);
// und sicher daß die Strings nicht verschoben/verändert werden?
oder versuch mal
Delphi-Quellcode:
par:=PChar(aValue^);
// oder
par:=PPChar(aValue)^;

Neutral General 5. Apr 2010 19:53

Re: Pointer zu String?
 
Zitat:

Zitat von himitsu
Das ist aber ein Zeiger auf das letzte Zeichen und kein Zeiger auf einen Delphi-String.

Delphi-Quellcode:
par := Char(aValue^);
// oder
par := PChar(aValue)^; // "kein" Zeiger auf einen PChar-String, sondern auf ein Char

Nicht wenn stra = STRingArray => stra: Array of String;

Teekeks 5. Apr 2010 19:55

Re: Pointer zu String?
 
stra ist ein globales array of string.
den pointer setze ich selbst. Und untypisiert ist er weil auch andere Typen als string am anderen ende vorkommen können.

Teekeks 5. Apr 2010 19:59

Re: Pointer zu String?
 
OKOKOK, ihr braucht euch keine Gedanken machen.
Der leerstring wurde von mir schon da eingesetzt, ich hatte es nur nicht mitgekriegt. :(

Danke euch allen für eure Bemühungen!

himitsu 5. Apr 2010 19:59

Re: Pointer zu String?
 
Ja, das
Zitat:

stehen in 2 unterschiedlichen Methoden und stra ist ein lokales Array of String?
hatte ich dann auch gesehn
und oben noch ein bissl rumeditiert. :oops:


[edit]
bitte und :lol:

4dk2 13. Apr 2016 09:41

AW: Pointer zu String?
 
Ich hab auch mal ne Frage zu dem Thema:

Delphi-Quellcode:
var
    sIn1:string;
    sIn2:string[2];

    p1,p2:pointer;
    s1,s2 :string;
begin
  sIn1:='foobar';
  sIn2:='fb';
  p1:=addr(sIn1);
  p2:=addr(sIn2);

  s1:=pstring(p1)^;
  s2:=pstring(p2)^;//exception, warum bei string[2] ?

  showmessage(s1+'/'+s2);
end;
was für ein Typ ist denn ein string[n] ?
Wirft bei der dem Zugriff pstring(p2)^ ne EAccessViolation aus.

himitsu 13. Apr 2016 09:46

AW: Pointer zu String?
 
Der Typ String[X] ist ein ShortString mit der maximalen Länge X.
Das sollte aber auch in der OH zu finden sein. (irgendwo)

Und da String/AnsiString/UnicodeString (nicht WideString) intern "LongStrings" und das bereits Pointer sind, sollte das Dereferenzieren von pstring(p1)^ ebenfalls falsch sein, da es wohl eher string(p1) lauten müsste. :gruebel:

4dk2 13. Apr 2016 09:54

AW: Pointer zu String?
 
Delphi-Quellcode:
s2:=PShortString(p2)^;
klappt :)
hmmm, ich vermute mal man kann nicht prüfen, ob der Pointer, normaler String oder Shortstring ist?

4dk2 13. Apr 2016 10:21

AW: Pointer zu String?
 
Zitat:

Zitat von himitsu (Beitrag 1335454)
Und da String/AnsiString/UnicodeString (nicht WideString) intern "LongStrings" und das bereits Pointer sind, sollte das Dereferenzieren von pstring(p1)^ ebenfalls falsch sein, da es wohl eher string(p1) lauten müsste. :gruebel:

Delphi-Quellcode:
s1:=string(p1);
Also DAS ist wirklich ne EVIL function.
Hat bei mir grad Windows gekillt. (mit D7 getestet, und im zweiten anlauf hat windows überlebt)
krallt sich den Maximal verfügbaren RAM :lol:

himitsu 13. Apr 2016 10:22

AW: Pointer zu String?
 
Windows 9x?

Zitat:

Zitat von 4dk2 (Beitrag 1335455)
hmmm, ich vermute mal man kann nicht prüfen, ob der Pointer, normaler String oder Shortstring ist?

Jupp, die Antwort ist Nein.

4dk2 13. Apr 2016 10:34

AW: Pointer zu String?
 
:-D neee win7.
Aber ich hatte beim ersten Mal auch noch 2 vms und vis Studio offen und der RAM war dementsprechend schon etwas voll

himitsu 13. Apr 2016 10:49

AW: Pointer zu String?
 
Ups Delphi-Referenz durchsuchenSystem.Addr,
Delphi-Quellcode:
p1:=addr(sIn1); p2:=addr(sIn2);
entspricht
Delphi-Quellcode:
p1:=@sIn1; p2:=@sIn2;
, womit das mit den
Delphi-Quellcode:
PString(sIn1)^
doch stimmt.
Aber da hatest du zufällig ganz böses Pech, dass dein Programm nicht vorher mit OutOfMemory abbrach, sondern das grade noch so in den RAM reinbekommen hatte und dann für nichts Anderes mehr Platz war.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 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