Cast P-Typ zu dynamischer array

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 7230
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: 7230
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

PascalDragon
Beiträge: 1032
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: Cast P-Typ zu dynamischer array

Beitrag von PascalDragon »

Mathias hat geschrieben: Di 10. Feb 2026, 22:18 Fehler gefunden, das Problem liegt ganz wo anders. Und ein Cast auf eine dynamische Array erzeugt nur Speicherleeks.
Korrekt. Ein dynamisches Array ist mehr als nur ein Zeiger auf das erste Element. Du kannst aber ohne Problem auf einen Pointer auch mit der Arraysyntax zugreifen (PtrVar[Idx])
FPC Compiler Entwickler

Antworten