Hallo, ich hoffe es kann mir jemand auf die Sprünge helfen.
Ich habe die tgPuttyLib (sftp Klasse) und finde darin eine Struktur, die ich zusammen mit dem Beispiel nicht verstehe.
Zunächst die Deklaration:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type fxp_attrs=record flags:UInt32; size: UInt64; uid,gid, permissions, atime,mtime:UInt32; end; Pfxp_attrs=^fxp_attrs;
fxp_name=record filename,longname:PAnsiChar; attrs :fxp_attrs; end; Pfxp_name=^fxp_name;
fxp_names=record nnames:Integer; names:Pfxp_name; end; Pfxp_names=^fxp_names; |
Dann die Frage:
In einem Beispiel wird das so verwendet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function TTester.ListingCallback(const names:Pfxp_names):Boolean; var i:Integer; begin for i:=0 to names^.nnames-1 do WriteLn(names^.names[i].filename:40,' ',names^.names[i].attrs.size:10); Result:=true; end; |
Der Teil names.names[i] wird vom Compiler, meiner Meinung nach zu Recht, angemeckert, weil in der
Deklaration gibt es kein Array das man indizieren könnte. "Error: Array type required"
Andererseits enthält die Deklaration mit nnames ja ein
Feld welches die Anzahl der Records angeben soll(te), mit names:Pfxp_name aber nur einen Pointer auf ein fxp_name Record.
Und das enthält auch keine weiteren Pointer die eine Liste bilden könnten.
Ohne den Index liefert mir names.names.filename einen Dateinamen, der auch stimmt. Aber nur den einen obwohl nnames 4 liefert.
Wie names zusammengestöpselt wird kann ich nicht sagen, das verbirgt sich in der tgputtylib.dll
Gibt es da in Delphi vielleicht eine gewisse Magie, die names indizierbar macht ohne das zu deklarieren? Und wenn ja, wie
bringt man das dann dem Larzarus/fpc bei?
Habe da einen Knoten im Hirn, komme nicht drauf wie das richtig funktionieren soll. Wäre für Hilfe und Tips dankbar.