Cast P-Typ zu dynamischer array

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

Cast P-Typ zu dynamischer array

Beitrag von Mathias »

Ist sowas erlaubt, oder kann dies gefährlich werden ?
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
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Cast P-Typ zu dynamischer array

Beitrag von Mathias »

Fehler gefunden, das Problem liegt ganz wo anders. Und ein Cast auf eine dynamische Array erzeugt nur Speicherleeks.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten