Discussion:
PChar und copy
(zu alt für eine Antwort)
Jens Köhler
2016-02-07 14:35:31 UTC
Permalink
Hallo Leute,

ich bin gerade über eine Merkwürdigkeit gestolpert.

Ich versuch aus einem PChar eine Stück heraus zu kopieren.
var
PC : PChar;
s : string;

PC := PChar('123456789TestText');

s := Copy(PC, 1, 3);

sollte eigentlich '234' ergeben, da PChar ja bei Index 0 beginnt.
in s steht aber '123'. Das gleiche Ergebnis ('123') erhalte ich aber
auch mit Index 0

s := Copy(PC, 0, 3);

Kann das jemand nachvollziehen und mir dieses für mich merkwürdige
verhalten erklären.

Jens
Georg Hübner
2016-02-08 09:49:16 UTC
Permalink
Hallo Jens,

vielleicht helfen Dir diese Infos weiter:
http://docwiki.embarcadero.com/RADStudio/XE8/de/Migrieren_von_Delphi-Code_zu_mobilen_Anwendungen_vom_Desktop_aus

...
Post by Jens Köhler
var
PC : PChar;
s : string;
PC := PChar('123456789TestText');
s := Copy(PC, 1, 3);
sollte eigentlich '234' ergeben, da PChar ja bei Index 0 beginnt.
in s steht aber '123'. Das gleiche Ergebnis ('123') erhalte ich aber auch mit Index 0
s := Copy(PC, 0, 3);
Kann das jemand nachvollziehen und mir dieses für mich merkwürdige verhalten erklären.
...

Mfg


Georg Hübner
Jens Köhler
2016-02-08 15:29:37 UTC
Permalink
Post by Georg Hübner
Hallo Jens,
Mfg
Georg Hübner
Hallo,

danke, aber ich kann da leider nichts passendes finden.

Jens
Georg Hübner
2016-02-09 13:45:05 UTC
Permalink
Hallo Jens,
Post by Jens Köhler
danke, aber ich kann da leider nichts passendes finden.
stimmt. Die Frage warum Copy mit Index = 0 oder 1 immer ab dem ersten Zeichen kopiert, wird da leider nicht beantwortet. :-(
Aber das hat Peter ja schon erklärt.

Aufgrund der Antwort von Julius habe ich mal spasseshalber mit negativen Index experimentiert. (mit Delphi 7 Pro)

s := Copy(PC, -1, 3); // ergibt: '123'

oder


s := Copy(PC, -2, 3); // ergibt auch: '123'

Interessant, macht aber irgenedwie keinen Sinn. :-/

MfG


Georg Hübner
Hans-Peter Diettrich
2016-02-10 03:46:11 UTC
Permalink
Post by Georg Hübner
Die Frage warum Copy mit Index = 0 oder 1 immer ab dem ersten
Zeichen kopiert, wird da leider nicht beantwortet. :-(
Aber das hat Peter ja schon erklärt.
Aufgrund der Antwort von Julius habe ich mal spasseshalber mit negativen
Index experimentiert. (mit Delphi 7 Pro)
s := Copy(PC, -1, 3); // ergibt: '123'
oder
s := Copy(PC, -2, 3); // ergibt auch: '123'
Interessant, macht aber irgenedwie keinen Sinn. :-/
Da Copy keinen Fehlercode liefern kann, wird eben ein Index außerhalb
des zulässigen Bereichs (<1) auf den Anfang des Strings gemapt, und von
dort die gewünschte Anzahl Zeichen geliefert.

DoDi

Julius Kavay
2016-02-08 14:39:23 UTC
Permalink
Hallo,
Post by Jens Köhler
Ich versuch aus einem PChar eine Stück heraus zu kopieren.
var
PC : PChar;
s : string;
PC := PChar('123456789TestText');
s := Copy(PC, 1, 3);
sollte eigentlich '234' ergeben, da PChar ja bei Index 0 beginnt.
in s steht aber '123'. Das gleiche Ergebnis ('123') erhalte ich aber
auch mit Index 0
s := Copy(PC, 0, 3);
Kann das jemand nachvollziehen und mir dieses für mich merkwürdige
verhalten erklären.
Lese mal das:

http://www.delphibasics.co.uk/RTL.asp?Name=Copy

Unter NOTES steht, Zitat:
"For string copying, a StartChar less than 1 is treated as 1."

Gruesse
Julius

--
Jens Köhler
2016-02-08 15:31:19 UTC
Permalink
Post by Julius Kavay
http://www.delphibasics.co.uk/RTL.asp?Name=Copy
"For string copying, a StartChar less than 1 is treated as 1."
Gruesse
Julius
Hallo,

danke, ich kopiere aber nicht aus einem String sondern aus PChar,
das, soweit ich weiß, bei Index 0 beginnt.

Jens
Peter Below
2016-02-08 15:24:26 UTC
Permalink
Post by Jens Köhler
Hallo Leute,
ich bin gerade über eine Merkwürdigkeit gestolpert.
Ich versuch aus einem PChar eine Stück heraus zu kopieren.
var
PC : PChar;
s : string;
PC := PChar('123456789TestText');
s := Copy(PC, 1, 3);
sollte eigentlich '234' ergeben, da PChar ja bei Index 0 beginnt.
Mitnichten. Es gibt kein Overload der Copy-Funktion die eine PChar als
ersten Parameter akzeptiert. Der Compiler erzeugt daher aus deinem
PChar einen temporären String, der dann an die Copy-Funkion übergeben
wird. Und der ist 1-basiert. PChar ist halt assignment-kompatibel zu
String da der Compiler eine automatische Konvertierung durchführt, wenn
das notwendig ist.
Post by Jens Köhler
in s steht aber '123'. Das gleiche Ergebnis ('123') erhalte ich aber
auch mit Index 0
s := Copy(PC, 0, 3);
Kann das jemand nachvollziehen und mir dieses für mich merkwürdige
verhalten erklären.
--
Peter Below
TeamB
Jens Köhler
2016-02-08 15:36:59 UTC
Permalink
Post by Peter Below
Mitnichten. Es gibt kein Overload der Copy-Funktion die eine PChar als
ersten Parameter akzeptiert. Der Compiler erzeugt daher aus deinem
PChar einen temporären String, der dann an die Copy-Funkion übergeben
wird. Und der ist 1-basiert. PChar ist halt assignment-kompatibel zu
String da der Compiler eine automatische Konvertierung durchführt, wenn
das notwendig ist.
Hallo,

danke für die erhellende Antwort.

Jens
Hans-Peter Diettrich
2016-02-07 16:19:32 UTC
Permalink
Post by Jens Köhler
Ich versuch aus einem PChar eine Stück heraus zu kopieren.
var
PC : PChar;
s : string;
PC := PChar('123456789TestText');
s := Copy(PC, 1, 3);
sollte eigentlich '234' ergeben, da PChar ja bei Index 0 beginnt.
in s steht aber '123'. Das gleiche Ergebnis ('123') erhalte ich aber
auch mit Index 0
s := Copy(PC, 0, 3);
Kann das jemand nachvollziehen und mir dieses für mich merkwürdige
verhalten erklären.
Ich vermute, daß bei Copy ein String aus dem PChar erzeugt wird.
Oder kennst Du eine überladene Version von Copy, die einen PChar
Parameter hat?

DoDi
Loading...