Es geht mir darum, wen in C ein P-Typ zurück geliefert wird, ob man den so in eine dynamische array Casten darf.
Code: Alles auswählen
const
hello = 'Hello World';
var
ca: array of char = nil;
function getChar: pchar;
begin
Result := hello;
end;
begin
SetLength(ca, Length(hello)); // nur zum Test, in C kommt die echte Länge als Parameter
pchar(ca) := getChar; // der springende Punkt
WriteLn(pchar(ca));
end.Dies hier habe ich im original Code, und da knallt es beim Cast.
SetLength muss stimmen, sonst würde es bei dem nativen Aufruf auch knallen.
Code: Alles auswählen
// Die C-Bindung
function manifold_meshgl_tri_verts(mem: pointer; m: PManifoldMeshGL): Puint32_t; cdecl; external libmanifoldc;
function manifold_meshgl_vert_properties(mem: pointer; m: PManifoldMeshGL): Psingle; cdecl; external libmanifoldc;
// In eine Classe eingekapselt
function TMeshGL.tri_verts: Puint32_t;
begin
Result:=manifold_meshgl_tri_verts(mem, Fobj);
end;
function TMeshGL.vert_properties: Psingle;
begin
Result:=manifold_meshgl_vert_properties(mem, Fobj);
end;
// In der main
var
verts_data: array of single = nil;
tris_data: array of Tuint32_t = nil;
....
SetLength(verts_data, n_verts * n_props);
SetLength(tris_data, n_tris * 3);
manifold_meshgl_tri_verts(Puint32_t(tris_data), mesh.obj); // io.
manifold_meshgl_vert_properties(PSingle(verts_data), mesh.obj); // io.
// Puint32_t(tris_data) := mesh.tri_verts; // Dies knallt
// PSingle(verts_data) := mesh.vert_properties; // Dies knallt