PChar, am Ende ein #0 ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

PChar, am Ende ein #0 ?

Beitrag von Mathias »

Habe ich eine Garantie, das der String am Ende ein #0 hat ?
Writeln funktioniert, aber Length gibt mir 5 aus. Bei der for-Schleife, werden am Schluss '0' ausgegeben.

Code: Alles auswählen

program Project1;
var
  pc: PChar;
  i: integer;
begin
  pc := 'XXXXXXXXXXXXXXXXXXX';
  WriteLn(pc);
  pc := '12345';
  WriteLn(pc);
  for i := 0 to 10 do begin
    Write(byte(pc[i]): 4);
  end;
  WriteLn();
  WriteLn(Length(pc));
end.

oder ist es besser, wen ich

Code: Alles auswählen

pc := '12345' + #0;
mache ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: PChar, am Ende ein #0 ?

Beitrag von m.fuchs »

Warum? Pascal hat doch nun wirklich vernünftige Stringbehandlung, warum muss da denn so eine Ferkelei gemacht werden?
Überhaupt gibt es keinen Grund PChar zu verwenden, außer Fremdcode erwartet das.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: PChar, am Ende ein #0 ?

Beitrag von Mathias »

Warum? Pascal hat doch nun wirklich vernünftige Stringbehandlung,
Normalerweise verwende ich schon Strings, aber wie du schon sagst, wen man etwas fremdes einbindet, ist man angewiesen. Nur schon bei OpenGL GLSL braucht man dies.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: PChar, am Ende ein #0 ?

Beitrag von m.fuchs »

Dazu musst du aber nicht von Hand daran herumfummeln. Hier steht eigentlich alles drin, was notwendig ist: http://wiki.freepascal.org/PChar
Füge kein eigenes Terminierungssysmbol hinzu und baue nicht solche wilden for-Schleifen die auf den falschen Speicher zugreifen sollen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: PChar, am Ende ein #0 ?

Beitrag von Mathias »

Genau, wegen dem Wiki wollte ich dies wissen, ob Pascal selbst ein #0 hinten ranhängt.
So wie es scheint, ist dies der Fall, aber wieso gibt mein Length oben nur 5 Zeichen ?
Wen noch ein #0 hinten wäre, müssten es doch 6 Zeichen sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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: PChar, am Ende ein #0 ?

Beitrag von Socke »

Mathias hat geschrieben:So wie es scheint, ist dies der Fall, aber wieso gibt mein Length oben nur 5 Zeichen ?
Wen noch ein #0 hinten wäre, müssten es doch 6 Zeichen sein.

Length() gibt die Anzahl der Zeichen; #0 wird in der Regel as Nichtzeichen betrachtet.
Weiterhin gibt es noch weitere Gründe, warum die gesamte Speichermenge eines Pascal-Strings nicht gleich der Zeichen ist.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: PChar, am Ende ein #0 ?

Beitrag von m.fuchs »

Mathias hat geschrieben:Genau, wegen dem Wiki wollte ich dies wissen, ob Pascal selbst ein #0 hinten ranhängt.

Ja, völlig automatisch ohne dass sich der User darum kümmert.

Mathias hat geschrieben:So wie es scheint, ist dies der Fall, aber wieso gibt mein Length oben nur 5 Zeichen ?

Weil '12345' exakt fünf Zeichen enthält.

Mathias hat geschrieben:Wen noch ein #0 hinten wäre, müssten es doch 6 Zeichen sein.

Nein, der Terminator zählt nicht mit. Deswegen sage ich ja: konzentriere dich nicht auf den internen Datenaufbau und versuch da nichts händisches aufzubauen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: PChar, am Ende ein #0 ?

Beitrag von Mathias »

Jetzt weis ich, wieso ich einen Knopf hatte, ich habe PChar un 0-Terminierte String verwechselt. :oops:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: PChar, am Ende ein #0 ?

Beitrag von m.fuchs »

Mathias hat geschrieben:Jetzt weis ich, wieso ich einen Knopf hatte, ich habe PChar un 0-Terminierte String verwechselt. :oops:

Ein PChar ist ein 0-terminierter String.

Also eigentlich ist es ein Pointer auf ein Char, dieses Char ist wiederum das erste Zeichen eines 0-terminierten Strings.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten