[gelöst] wie geht PChar

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
oliver2104
Beiträge: 22
Registriert: Sa 26. Dez 2020, 13:22

[gelöst] wie geht PChar

Beitrag von oliver2104 »

Hallo, ich brauche für ein Programm den Datentyp PChar,
scheitere aber schon bei den einfachsten Dingen.
Hab mir ein Test-Programm laut der fpc-Wiki erstellt:

Code: Alles auswählen

// Source: https://wiki.freepascal.org/PChar
program test;
{$MODE OBJFPC }
uses
  sysutils;
var       
  p: PChar;      //Declaration:
Begin
  // Valid assignments:
  p := 'This is a null-terminated string.';  // das funktioniert
  p := IntToStr(45); // das nicht -> Error: Incompatible types: got "AnsiString" expected "PChar"
End.
was mach ich da falsch ?
Zuletzt geändert von oliver2104 am Fr 15. Jan 2021, 09:21, insgesamt 1-mal geändert.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: wie geht PChar

Beitrag von PascalDragon »

oliver2104 hat geschrieben:
Mi 13. Jan 2021, 13:26
scheitere aber schon bei den einfachsten Dingen.
PChar zählt eben schon an sich nicht zu den einfachsten Dingen.
oliver2104 hat geschrieben:
Mi 13. Jan 2021, 13:26
was mach ich da falsch ?
Du mischt Pascal Strings und Null terminierte Strings.

Du hast zwei Möglichkeiten das zu lösen.

Entweder, wenn der Pascal String für die Lebenszeit des PChars ebenfalls aktiv bleibt, dann kannst du einfach zu PChar umcasten. Dein Beispiel wäre dann wie folgt:

Code: Alles auswählen

var
  s: String;
  p: PChar;
begin
  s := IntToStr(42);
  p := PChar(s); // nicht direkt den Funktionsaufruf hier reinmachen!
  // solange "s" im Scope ist, ist "p" auch zugreifbar
end.
Andernfalls musst du umkopieren und dann auch den PChar wieder selbst freigeben:

Code: Alles auswählen

var
  s: String;
  p: PChar;
begin
  s := IntToStr(42);
  p := PChar(GetMem(Length(s) + 1));
  Move(s[1], p[0], Length(s) + 1); // dies kopiert das #0, das jeder AnsiString am Ende hat, mit
  // nutze p
  // ...
  FreeMem(p);
end.
FPC Compiler Entwickler

oliver2104
Beiträge: 22
Registriert: Sa 26. Dez 2020, 13:22

Re: wie geht PChar

Beitrag von oliver2104 »

Danke für die tolle Antwort,
glaubte schon, ich hätte es verstanden und hab dein erstes Beispiel ausprobiert.
Also das mit dem Erhalt des Strings.

Code: Alles auswählen

program test;
{$MODE OBJFPC}
uses
  sysutils;
var
  s: String;
  p: PChar;
begin
  s := IntToStr(42);
  p := PChar(s); // nicht direkt den Funktionsaufruf hier reinmachen!
  // solange "s" im Scope ist, ist "p" auch zugreifbar
end.
Leider kompiliert das schon wieder nicht wegen:

Code: Alles auswählen

  p := PChar(s);  // test.pas(10,8) Error: Illegal type conversion: "ShortString" to "PChar"; 
Also wenn das bei dir funktioniert, hab ich vielleicht eine falsche Compiler-Option oder eine fehlende Uses-Declaration

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: wie geht PChar

Beitrag von m.fuchs »

oliver2104 hat geschrieben:
Do 14. Jan 2021, 11:10
Leider kompiliert das schon wieder nicht wegen:

Code: Alles auswählen

  p := PChar(s);  // test.pas(10,8) Error: Illegal type conversion: "ShortString" to "PChar"; 
Also wenn das bei dir funktioniert, hab ich vielleicht eine falsche Compiler-Option oder eine fehlende Uses-Declaration
Füge mal noch

Code: Alles auswählen

{$H+}
zu den Compileroptionen dazu.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

oliver2104
Beiträge: 22
Registriert: Sa 26. Dez 2020, 13:22

Re: wie geht PChar

Beitrag von oliver2104 »

Danke, jetzt hat es funktioniert !

Antworten