array of const
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1646
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: array of const
Danke für die Erklärung.
-
- Beiträge: 6916
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: array of const
Ist eine Mischung aus "array of const" und "varargs" möglich ?
Ich habe folgendes in den GTK"-Sourcen entdeckt:
In den C-Sourcen sieht dies so aus: Eigentlich nichts besonderes.
Ich bin in folgendem Beispiel stecken geblieben: https://zetcode.com/gui/gtk2/gtktreeview/ 3. Beispiel (treeview.c)
Nur wird mir mit SIGSEGV quitiert.
Kann mir einer weiter helfen ?
Ich habe folgendes in den GTK"-Sourcen entdeckt:
Code: Alles auswählen
function gtk_tree_store_new(n_columns:gint):PGtkTreeStore; cdecl; overload; external gtklib;
function gtk_tree_store_new(n_columns:gint; args:array of const):PGtkTreeStore; cdecl; overload; varargs; external gtklib;
Code: Alles auswählen
GtkTreeStore *gtk_tree_store_new (gint n_columns, ...);
Ich bin in folgendem Beispiel stecken geblieben: https://zetcode.com/gui/gtk2/gtktreeview/ 3. Beispiel (treeview.c)
Code: Alles auswählen
const
COLUMN = 0;
NUM_COLS = 1;
....
var
treestore: PGtkTreeStore;
begin
treestore := gtk_tree_store_new(NUM_COLS, [G_TYPE_STRING]);
gtk_tree_store_append(treestore, @toplevel, nil);
gtk_tree_store_set(treestore, @toplevel, COLUMN, 'Interpreter Sprachen', -1);
gtk_tree_store_append(treestore, @child, @toplevel);
gtk_tree_store_set(treestore, @child, COLUMN, 'Python', -1);
.....

Kann mir einer weiter helfen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 3178
- 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: array of const
array of const wird bei external cdecl doch automatisch zu varargs? Ich hätte den varargs-Modifier also bei der ersten Zeile erwartet (siehe auch https://www.freepascal.org/docs-html/ref/refsu97.html)Mathias hat geschrieben: Mi 22. Mär 2023, 09:09 Ist eine Mischung aus "array of const" und "varargs" möglich ?
Also so herum:
Code: Alles auswählen
function gtk_tree_store_new(n_columns:gint):PGtkTreeStore; cdecl; overload; varargs; external gtklib;
function gtk_tree_store_new(n_columns:gint; args:array of const):PGtkTreeStore; cdecl; overload; external gtklib;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 6916
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: array of const
Also habe ich es richtig verstanden, ein Bug in der gtk2-Unit ?Also so herum:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6916
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: array of const
Code: Alles auswählen
gtk_tree_store_set(treestore, @child, COLUMN, 'CC', -1); // geht
gtk_tree_store_set(treestore, @child, COLUMN, 'C', -1); // SIGSEV
Mit einer manuellen Umwandlung geht es.
Code: Alles auswählen
gtk_tree_store_set(treestore, @child, COLUMN, PChar('C'), -1);
Gut ich gebe zu, ich arbeite hier mit einer Brücke von Pascal nach C-libs.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 3178
- 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: array of const
In C/C++ gibt es halt keinen Unterschied zwischen einem und mehreren Zeichen.Mathias hat geschrieben: Mi 22. Mär 2023, 13:58 Da hat C/C++ ausnahmsweise Pascal eine Nasenlänge voraus. Dort muss man so "C" oder 'C' deklarieren.
Gut ich gebe zu, ich arbeite hier mit einer Brücke von Pascal nach C-libs.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 6916
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: array of const
Ich stehe wieder mal vor einem Problem. Wieso kann ich eine "array of const" innerhalb von FPC weiterleiten, aber auf eine clib geht es nicht ?
Code: Alles auswählen
procedure vaTest(args: array of const); cdecl; external 'c';
procedure test2(ca: array of const);
begin
end;
procedure test(ca: array of const);
begin
test2(ca); // geht
vaTest([12, 'abc']); // geht
vaTest(ca); // geht nicht
end;
begin
test([123, 456]);
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: array of const
Mathias hat geschrieben: Mi 16. Nov 2022, 17:24Da wird eine "array of const" verlangt.Code: Alles auswählen
function XGetIMValues(para1:PXIM; dotdotdot:array of const):Pchar;cdecl;external libX11;
Da wollte ich folgendes deklarieren;Da motzt der Colpiler "Illegal expression"Code: Alles auswählen
var ac:array of const;
Wie kann ich dieses Problem lösen ?
Code: Alles auswählen
program Project1; {$mode objfpc}
uses SysUtils;
var
b: Array of TVarRec;
procedure Foo(a: array of const);
var
i: Integer;
begin
SetLength(b, Length(a));
for i := 0 to Length(a) - 1 do
b[i] := a[i];
end;
begin
foo([1,'ab', 1.3]);
writeln(Format('%d %s %f', b));
readln;
end.
Aber Vorsicht!
Strings sind nicht ref-counted.
Wenn der string der an foo übergeben wurde sich ändert, dann wird der Wert in b[1] zum dangling pointer.
-
- Beiträge: 955
- 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: array of const
Ein array of const einer Pascal-Funktion ist ein Zeiger auf ein Array, dass auf dem Stack abgelegt wird plus die Länge des Arrays. Ein array of const einer cdecl-Funktion ist ein Äquivalent zu varargs und wird speziell übergeben (jedes einzelne Element wird auf den Stack gepushed bzw. in die zugehörigen Register gesteckt (v.a. auf nicht-i386/i8086)). Deshalb kannst du nicht einfach das eine an das andere übergeben.Mathias hat geschrieben: Di 23. Apr 2024, 16:55 Ich stehe wieder mal vor einem Problem. Wieso kann ich eine "array of const" innerhalb von FPC weiterleiten, aber auf eine clib geht es nicht ?
Code: Alles auswählen
procedure vaTest(args: array of const); cdecl; external 'c'; procedure test2(ca: array of const); begin end; procedure test(ca: array of const); begin test2(ca); // geht vaTest([12, 'abc']); // geht vaTest(ca); // geht nicht end; begin test([123, 456]); end.
FPC Compiler Entwickler