![]() |
return Pointer / dynamic array
Hallo,
ich versuche etwas OpenGl Graik unter Delphi, habe aber Probleme mit dyn.arrays und Pointern (hab das mal in C++ gemacht) Ich habe ein dynamisches Array von Vertexdaten im Mesh (protected):
Code:
Nun möchte ich auf die Daten von aussen zugreifen, um sowas zu tun
TVertex = packed record
x, y, z: Real; end; TMesh = class protected fVertices: array of TVertex; end;
Code:
Wie mache ich das?
property Vertices : array of TVertex read fVertices;
function GetVertices : array of TVertex; [...] procedure TRenderer.DrawMesh(mesh: TMesh); var vertices: array of TVertex; begin vertices:= mesh.GetVertices; vertices[0].y := 1; glVertexPointer(3, GL_FLOAT, sizeof(TVertex), vertices[0].x); Sind dynamische Arrays überhaupt gleichzusetzen mit c++: vertices = new TVertex[count]; ? |
AW: return Pointer / dynamic array
Wenn da
Delphi-Quellcode:
steht, dann schließt das einen Zugriff von außen bewusst aus - zumindest nicht ohne Tricks.
protected
Woher kommt denn die TMesh-Deklaration? Wenn die von dir selbst kommt, warum dann das
Delphi-Quellcode:
, wenn du doch von außen darauf zugreifen willst?
protected
|
AW: return Pointer / dynamic array
dynamische Arrays sind halt dynamische Arrays, auch als Result ... die werden auch schön automatisch aufgeräumt (k.A. wie das in C++ ist)
Aber als Result ist "array of" echt beschissen. Entweder als externer Typ oder generisch via TArray<>, denn eine "kompatibe" Variable ist sonst nicht nutzbar und das Einzige was ohne Variable ginge, wäre
Delphi-Quellcode:
. :wall:
for M in mesh.GetVertices do
Abgesehn von den Zugriffsproblemen auf Protected/Private, welche ja nur Intern freigegeben sind. Zitat:
|
AW: return Pointer / dynamic array
Zitat:
Es gibt neben Result auch die var/out Rückgabe, als Alternative. Aber auch da würde ich eigenen Typ / TArray<> bevorzugen.
Delphi-Quellcode:
procedure IncArray1(data: array of integer);
var i : integer; begin for i := Low(data) to High(data) do data[i] := data[i] + 5; end; |
AW: return Pointer / dynamic array
Zitat:
Die Frage ist auch, ob ein "array of" einen zusammenhängenden Speicherbereich reserviert, oder ob es sowas wie ne verkettete Liste oder so ist, und somit die einzelnen Elemente des Arrays im Speicher kreuz und quer liegen können. Weil diesen "Speicherbereich" muss ich an die OpenGl Funktionen "an einem Stück" übergeben. |
AW: return Pointer / dynamic array
Nach meiner Kenntnis liegen Arrays immer blockweise im Speicher.
|
AW: return Pointer / dynamic array
Oder kann ich z.b. ein "array of TVertex" in ein Pointer casten, diesen zurückgeben, und später bei Bedarf diesen wieder in ein "array of TVertex" zurückcasten?
|
AW: return Pointer / dynamic array
Zitat:
|
AW: return Pointer / dynamic array
Ich glaube renew möchte einfach nur die Syntax zu dynamische Arrays als Rückgabewert erfahren. So sollte es gehen:
Delphi-Quellcode:
type
TVertexDynArray = array of TVertex; TMesh = class protected fVertices: TVertexDynArray; public property Vertices : TVertexDynArray read fVertices; function GetVertices : TVertexDynArray ; end; [...] procedure TRenderer.DrawMesh(mesh: TMesh); var vertices: TVertexDynArray; begin vertices:= mesh.GetVertices; vertices[0].y := 1; glVertexPointer(3, GL_FLOAT, sizeof(TVertex), vertices[0].x); |
AW: return Pointer / dynamic array
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz