PPChar Konstante

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

PPChar Konstante

Beitrag von Mathias »

In C sieht dies so aus:

Code: Alles auswählen

char *ch[]= {"abc", "def", "ghi", "jkl", 0};
Kann man dies auch in Pascal umsetzen ?

So etwas habe ich schon probiert, aber es gibt nur ein SyntaxError.

Code: Alles auswählen

  const
    ListData: PPChar = (('abc'), ('def'), ('ghi'), (nil));
Auch das weglassen der inneren Klammern bringt nichts.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: PPChar Konstante

Beitrag von theo »

Das ist ja eigentlich ein Array. Läuft auf das hinaus:

Code: Alles auswählen

const
  ListData: array of PChar = (('abc'), ('def'), ('ghi'), (nil));
var
  PC: PPChar;
begin
  PC := @ListData[0];

  ShowMessage(PC^);
  Inc(PC);
  ShowMessage(PC^);
  Inc(PC);
  ShowMessage(PC^);
end;   

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

Re: PPChar Konstante

Beitrag von Mathias »

Danke
Jetzt geht es.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: PPChar Konstante

Beitrag von Mathias »

Man darf sogar die Klammern und den #0 weglassen.

Code: Alles auswählen

  const
    ListData: array of PChar = ('abc', 'def', 'ghi', nil);    
Nur das "nil" brauche ich im meinem Fall.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: PPChar Konstante

Beitrag von Mathias »

theo hat geschrieben: Mo 6. Mär 2023, 18:21 Das ist ja eigentlich ein Array. Läuft auf das hinaus:

Code: Alles auswählen

const
  ListData: array of PChar = (('abc'), ('def'), ('ghi'), (nil));
var
  PC: PPChar;
begin
  PC := @ListData[0];

  ShowMessage(PC^);
  Inc(PC);
  ShowMessage(PC^);
  Inc(PC);
  ShowMessage(PC^);
end;   
Ich habe noch folgendes ersetzt.

Code: Alles auswählen

  //  PC := @ListData[0];
  PC := PPChar(ListData);
Dies hat den Vorteil, das es keine Speicherverletzung gibt, wen die Array mal aus 0 Elementen besteht.
Auch konnte ich so Fehlerfrei Daten an eine C-Lib übergeben.

Code: Alles auswählen

    XawListChange(list1, @ListData[0], Length(ListData), 50, True); // alt
    XawListChange(list1, PPChar(ListData), Length(ListData), 50, True); // neu
Nach meine Meinung sieht dies auch eleganter aus als mit dem @ und [].

Was ich aber nicht sicher bin, ob es das "nil" in der Const-Deklaration braucht.
Ich habe es mal ohne probiert, so wie es bei den Strings auch möglich ist.

Vielleicht weis einer von euch, ob es das nil braucht ?
Oder ob Pascal automatisch ein nil hinten anhängt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 962
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: PPChar Konstante

Beitrag von PascalDragon »

Mathias hat geschrieben: Di 25. Apr 2023, 14:02 Was ich aber nicht sicher bin, ob es das "nil" in der Const-Deklaration braucht.
Ich habe es mal ohne probiert, so wie es bei den Strings auch möglich ist.

Vielleicht weis einer von euch, ob es das nil braucht ?
Oder ob Pascal automatisch ein nil hinten anhängt ?
Das Nil ist nötig, da der C-Code wissen muss, wann das Array zu Ende ist. Im Gegensatz zu Ansi-, Wide- oder UnicodeString hängt FPC in dem Fall kein terminierendes Element an (unter anderem weil es kein generisches gibt).
FPC Compiler Entwickler

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

Re: PPChar Konstante

Beitrag von Mathias »

Das Nil ist nötig, da der C-Code wissen muss, wann das Array zu Ende ist.
Wie weis das der C-Code ?
So wie ich mich erinnern mag, habe ich schon C-Funktionen gesehen, bei denen man die Array Nil-terminiert übergeben muss und keine Längenangabe nötig ist..
Oder ist dies einfach bei unsauber geschriebenen Code der Fall ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 962
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: PPChar Konstante

Beitrag von PascalDragon »

Mathias hat geschrieben: Mi 26. Apr 2023, 16:55
Das Nil ist nötig, da der C-Code wissen muss, wann das Array zu Ende ist.
Wie weis das der C-Code ?
So wie ich mich erinnern mag, habe ich schon C-Funktionen gesehen, bei denen man die Array Nil-terminiert übergeben muss und keine Längenangabe nötig ist..
Oder ist dies einfach bei unsauber geschriebenen Code der Fall ?
Das ist einfach ein Standardschema in C Code weil es erlaubt einen Längenparameter einzusparen:

Code: Alles auswählen

procedure Test(aArg: PPChar);
var
  c: SizeInt;
begin
  c := 0;
  while Assigned(aArg) do begin
    Inc(c);
    Inc(aArg);
  end;
  Writeln('Count: ', c);
end;

var
  arr: array of PChar;
begin
  arr := ['Alpha', 'Beta', 'Gamma', Nil];
  Test(@arr[0]);
end.
FPC Compiler Entwickler

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

Re: PPChar Konstante

Beitrag von Mathias »

Das ist einfach ein Standardschema in C Code weil es erlaubt einen Längenparameter einzusparen:
Genau solches in dieser Art habe ich gesehen. Ob auch eine lib so angesprochen wurde, kann ich nicht mehr sagen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: PPChar Konstante

Beitrag von Mathias »

Noch eine Eigenintelligenz des Compilers entdeckt.

Dies ist eine C-lib Funktion mit varargs. Der Compiler nimmt da automatisch ein PChar an.

Code: Alles auswählen

    toplevel := XtVaAppInitialize(@app, 'Hello', nil, 0, @argc, argv, nil,
      XmNtitle, 'Cairo Open Motif', // geht
      nil);       
Ausser ich mache es so, dann muss zwingend ein PChar(....) hin, da folgendes Beispiel nicht kompilierbar ist.

Code: Alles auswählen

  var
    s:String='abc';
  begin
    toplevel := XtVaAppInitialize(@app, 'Hello', nil, 0, @argc, argv, nil,
      XmNtitle, s, // geht nicht !
      nil);   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 962
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: PPChar Konstante

Beitrag von PascalDragon »

Mathias hat geschrieben: Mo 15. Mai 2023, 20:03 Dies ist eine C-lib Funktion mit varargs. Der Compiler nimmt da automatisch ein PChar an.

Code: Alles auswählen

    toplevel := XtVaAppInitialize(@app, 'Hello', nil, 0, @argc, argv, nil,
      XmNtitle, 'Cairo Open Motif', // geht
      nil);       
Eine String Konstante hat keinen Typ, bis sie auf etwas zugewiesen wird. Der Compiler weiß, dass varargs Funktionen nur externe C Funktionen sein können und daher, dass diese nicht mit Pascal Strings arbeiten können, also nimmt er die String Konstante als PChar an.
Mathias hat geschrieben: Mo 15. Mai 2023, 20:03 Ausser ich mache es so, dann muss zwingend ein PChar(....) hin, da folgendes Beispiel nicht kompilierbar ist.

Code: Alles auswählen

  var
    s:String='abc';
  begin
    toplevel := XtVaAppInitialize(@app, 'Hello', nil, 0, @argc, argv, nil,
      XmNtitle, s, // geht nicht !
      nil);   
Wie oben weiß FPC, dass ein varargs keinen String erhalten kann und eine String Variable muss immer zu einem PChar gecastet werden, um zu einem solchen zugewiesen zu werden, da Pascal typsicher ist.
FPC Compiler Entwickler

Antworten