Code: Alles auswählen
char *ch[]= {"abc", "def", "ghi", "jkl", 0};
So etwas habe ich schon probiert, aber es gibt nur ein SyntaxError.
Code: Alles auswählen
const
ListData: PPChar = (('abc'), ('def'), ('ghi'), (nil));
Code: Alles auswählen
char *ch[]= {"abc", "def", "ghi", "jkl", 0};
Code: Alles auswählen
const
ListData: PPChar = (('abc'), ('def'), ('ghi'), (nil));
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;
Code: Alles auswählen
const
ListData: array of PChar = ('abc', 'def', 'ghi', nil);
Ich habe noch folgendes ersetzt.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;
Code: Alles auswählen
// PC := @ListData[0];
PC := PPChar(ListData);
Code: Alles auswählen
XawListChange(list1, @ListData[0], Length(ListData), 50, True); // alt
XawListChange(list1, PPChar(ListData), Length(ListData), 50, True); // neu
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).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 ?
Wie weis das der C-Code ?Das Nil ist nötig, da der C-Code wissen muss, wann das Array zu Ende ist.
Das ist einfach ein Standardschema in C Code weil es erlaubt einen Längenparameter einzusparen:Mathias hat geschrieben: Mi 26. Apr 2023, 16:55Wie weis das der C-Code ?Das Nil ist nötig, da der C-Code wissen muss, wann das Array zu Ende ist.
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 ?
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.
Genau solches in dieser Art habe ich gesehen. Ob auch eine lib so angesprochen wurde, kann ich nicht mehr sagen.Das ist einfach ein Standardschema in C Code weil es erlaubt einen Längenparameter einzusparen:
Code: Alles auswählen
toplevel := XtVaAppInitialize(@app, 'Hello', nil, 0, @argc, argv, nil,
XmNtitle, 'Cairo Open Motif', // geht
nil);
Code: Alles auswählen
var
s:String='abc';
begin
toplevel := XtVaAppInitialize(@app, 'Hello', nil, 0, @argc, argv, nil,
XmNtitle, s, // geht nicht !
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 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);
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.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);