Pointer(AnAnsiString) und @AnAnsiString[1] - equivalent?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
ColdWeather
Beiträge: 1
Registriert: Mi 22. Sep 2021, 16:11

Pointer(AnAnsiString) und @AnAnsiString[1] - equivalent?

Beitrag von ColdWeather »

Hallo, Leute.
Es gibt COM-Port Komponente LazSerial. Darin habe ich folgendes gesehen:

Code: Alles auswählen

      SetLength(Result, x);
      x := RecvBuffer(Pointer(Result), x);
'Result' ist ja ein String als Ergebnis der Funktion:

Code: Alles auswählen

function TBlockSerial.RecvPacket(Timeout: Integer): AnsiString;
Aufgerufen wird Funktion, definiert als:

Code: Alles auswählen

function TBlockSerial.RecvBuffer(buffer: pointer; length: integer): integer;
Das ganze läuft, doch mich hat es irritiert, so habe ich mal die "klassische Schule" ausprobiert:

Code: Alles auswählen

      x := RecvBuffer(@Result[1], x);
Das lässt sich kompilieren, und funktioniert danach auch fehlerfrei.

Frage: ist FreePascal so schlau, und Pointer(Result) ergibt nicht @Result[0]?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Pointer(AnAnsiString) und @AnAnsiString[1] - equivalent?

Beitrag von Winni »

Hi!

"An AnsiString points to the first character. "

Hier wirst Du schlau:

https://wiki.freepascal.org/Ansistring

Die deutsche Übersetzung ist leider ne Baustelle.

Winni

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Pointer(AnAnsiString) und @AnAnsiString[1] - equivalent?

Beitrag von Warf »

Nun es gibt unterschiede zwischen @str[1] und Pointer(str).
Das erste ist das wenn range checks aktiv sind, und der string list leer, dann fliegt dir @str[1] um die ohren. Außerdem, wobei ich mir hier nicht ganz sicher bin, haben strings Lazy copy mechaniker, wenn du also auf elemente eines mehrfach benutzten strings zugreifst muss dieser kopiert werden. Ich weiß nicht ob das bei dem Pointer cast auch auftritt oder nur bei schreibendem zugriff, aber je nach dem kann das zu zusätzlichem overhead führen

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Pointer(AnAnsiString) und @AnAnsiString[1] - equivalent?

Beitrag von Socke »

Warf hat geschrieben:
Mi 22. Sep 2021, 18:45
Außerdem, wobei ich mir hier nicht ganz sicher bin, haben strings Lazy copy mechaniker, wenn du also auf elemente eines mehrfach benutzten strings zugreifst muss dieser kopiert werden. Ich weiß nicht ob das bei dem Pointer cast auch auftritt oder nur bei schreibendem zugriff, aber je nach dem kann das zu zusätzlichem overhead führen
Das wirkt nur bei direkten Zuweisungen an String-Variablen. Wenn du über einen Zeiger den Inhalt des Strings manipulierst, wirkt sich das auf alle Referenzen aus. Will man das Vermeiden, kann man vor der Manipulation mit UniqueString() eine neue Kopie des Strings ohne fremde Referenzen erzeugen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten