PChar, am Ende ein #0 ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

PChar, am Ende ein #0 ?

Beitragvon Mathias » 17. Feb 2018, 17:44 PChar, am Ende ein #0 ?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3853
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 17. Feb 2018, 18:03 Re: PChar, am Ende ein #0 ?

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
m.fuchs
 
Beiträge: 1924
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 17. Feb 2018, 18:13 Re: PChar, am Ende ein #0 ?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3853
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 17. Feb 2018, 18:26 Re: PChar, am Ende ein #0 ?

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
m.fuchs
 
Beiträge: 1924
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 17. Feb 2018, 18:30 Re: PChar, am Ende ein #0 ?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3853
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Socke » 17. Feb 2018, 18:36 Re: PChar, am Ende ein #0 ?

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
Socke
 
Beiträge: 2497
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon m.fuchs » 17. Feb 2018, 18:36 Re: PChar, am Ende ein #0 ?

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
m.fuchs
 
Beiträge: 1924
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 17. Feb 2018, 20:22 Re: PChar, am Ende ein #0 ?

Jetzt weis ich, wieso ich einen Knopf hatte, ich habe PChar un 0-Terminierte String verwechselt. :oops:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3853
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 17. Feb 2018, 22:07 Re: PChar, am Ende ein #0 ?

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
m.fuchs
 
Beiträge: 1924
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 Gäste

porpoises-institution
accuracy-worried