Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   return Pointer / dynamic array (https://www.delphipraxis.net/204995-return-pointer-dynamic-array.html)

renew 21. Jul 2020 20:41

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:
    TVertex = packed record
        x, y, z: Real;
    end;
    TMesh = class
    protected
       fVertices: array of TVertex;
    end;
Nun möchte ich auf die Daten von aussen zugreifen, um sowas zu tun
Code:
    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);
Wie mache ich das?
Sind dynamische Arrays überhaupt gleichzusetzen mit c++: vertices = new TVertex[count]; ?

Uwe Raabe 21. Jul 2020 23:11

AW: return Pointer / dynamic array
 
Wenn da
Delphi-Quellcode:
protected
steht, dann schließt das einen Zugriff von außen bewusst aus - zumindest nicht ohne Tricks.
Woher kommt denn die TMesh-Deklaration? Wenn die von dir selbst kommt, warum dann das
Delphi-Quellcode:
protected
, wenn du doch von außen darauf zugreifen willst?

himitsu 21. Jul 2020 23:45

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:
for M in mesh.GetVertices do
. :wall:
Abgesehn von den Zugriffsproblemen auf Protected/Private, welche ja nur Intern freigegeben sind.

Zitat:

Wenn da protected steht, dann schließt das einen Zugriff von außen bewusst aus
Wobei ich dann die Frage des TE nicht verstehen würde, denn der Compiler meldet sich hier mit einer deutlichen Fehlermeldung.

Rollo62 22. Jul 2020 06:27

AW: return Pointer / dynamic array
 
Zitat:

Zitat von himitsu (Beitrag 1470044)
Aber als Result ist "array of" echt beschissen.
Entweder als externer Typ oder generisch via TArray<>

Ja das sehe ich auch so.

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;

renew 22. Jul 2020 09:39

AW: return Pointer / dynamic array
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1470042)
Wenn da
Delphi-Quellcode:
protected
steht, dann schließt das einen Zugriff von außen bewusst aus - zumindest nicht ohne Tricks.

Ich möchte ja nicht von außen mit Schreibrechten direkt auf die protected Membervariable zugreifen , deshalb will ich ja ein getter oder Property nur mit leserechten. also z.b. property Vertices : array of TVertex read fVertices; Aber das schaffe ich nicht wegen dem Rückgabetyp "array of ..."

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.

DeddyH 22. Jul 2020 09:51

AW: return Pointer / dynamic array
 
Nach meiner Kenntnis liegen Arrays immer blockweise im Speicher.

renew 22. Jul 2020 09:55

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?

himitsu 22. Jul 2020 11:49

AW: return Pointer / dynamic array
 
Zitat:

Zitat von renew (Beitrag 1470069)
Oder kann ich z.b. ein "array of TVertex" in ein Pointer casten, diesen zurückgeben

Wer das macht wird gesteinigt, gevierteilt, geköpft, gehängt und anschließend bekommt er noch eine Standpaucke, damit er nie wieder auf so eine saudämliche Idee kommt.

samso 22. Jul 2020 12:24

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);

renew 22. Jul 2020 18:28

AW: return Pointer / dynamic array
 
Zitat:

Zitat von samso (Beitrag 1470092)
Ich glaube renew möchte einfach nur die Syntax zu dynamische Arrays als Rückgabewert erfahren. So sollte es gehen:

genau das :-D Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz