Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 15:02

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TArray weiterreichen
BeitragVerfasst: Di Mai 08, 2018 19:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hiho,

ich habe mal eine Delphi-spezifische Frage. Wenn ich z. B: ein System.TArray<TPoint> anlege, wie kann ich dieses weiterreichen.
Also ich habe zB eine Methode, welche Punkte für eine Polylinie einliest und in TArray speichert (was ja nur ein neues Array of ... ist).
Wenn ich nun eine direkte Zuweisung mache, dann wird das Array ja kopiert. Ich möchte es aber an eine andere Klasse weiterreichen. So wie ich es mit Objektreferenzen ja auch tun kann.

Wie geh das mit TArray? Ich hab dazu bisher nix finden können. Danke!


VG

Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Mi Mai 09, 2018 17:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wieso nimmst du nicht einfach
Code:
  1. my: Array of TPoint
?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Do Mai 10, 2018 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
"?" ?

Array of <von irgendwas>, normales Delphi-Feature?

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Do Mai 10, 2018 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Mh hast du deinen post editiert, da stand doch vorhin was anderes? ^^

Ich habe bisher "Array of" benutzt, bekomme jetzt aber im Delphi 10.2 einen Compilefehler bei einer Zuweisung, wo ich mir die Adresse des Arrays hole.
Da Array of eh ein bisschen unschön ist, dachte ich, dass kann man sicherlich besser lösen.

Was ich will: ich will in zusammenhängendem Speicher Punkte ablegen und diesen Speicherbereich dann weiterreichen an eine Klasse (sodass ich nicht kopieren muss). In C++ würde ich einfach std::vector nehmen und wäre fertig. In Delphi habe ich jetzt das TArray entdeckt, aber wenn ich da eine Zuweisung mache, wird das Array kopiert. TList als Collection geht auch nicht, da es ja eine Liste ist und kein Array.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Do Mai 10, 2018 19:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Arrays in Delphi als Referenz übergeben geht mit vorangestelltem Keyword const (dann unveränderlich) oder var (veränderlich).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Fr Mai 11, 2018 16:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Ja als Parameter einer Methode. Ich will ja aber in der Klasseninstanz dann das Array übernehmen, sozusagen den Besitz übertragen. Bisher hatte ich das so:

Code:
  1. procedure TPolyLine.init(var newPoints : Array of TPoint; newCount : cardinal);
  2. var        i : cardinal;
  3.     collLine : TCollObject;
  4. begin
  5.    m_count  := newCount;
  6.    m_points := @newPoints;
  7.    m_width  := 1;
  8.  ...
  9.  


m_points ist so definiert: m_points : Array of TPoint;

Das ging bisher immer, kompiliert aber im Delphi 10.2 nicht mehr: [dcc32 Fehler] PolyLine.pas(77): E2010 Inkompatible Typen: 'Dynamic array' und 'Pointer'

TPoint ist bisher eine Klasse. Der Code ist ziemlich alt und ich will ihn eh überarbeiten. Ich will von der TPoint-Klasse weg, hin zu einem einfachen Record, da es nervt, jeden Punkt immer erst mit Create anlegen zu müssen und dann am Ende wieder freizugeben.
Das heißt, ich brauche ein dynamisches Array von einem Record von mir und will dieses später wie eine Instanz von einer Klasse weiterreichen können, um mir das Kopieren der Punkte zu sparen. Ich dachte erst, ich kann das mit Collections.TArray machen. Aber diese Klassen enthält nur statische Methoden. Ein System.TArray zuzuweisen, bedeutet immer kopieren und der alte Code von oben mit dem Klammeraffen geht nicht mehr.
Daher dachte ich, es muss doch eine Klasse geben ähnlich wie std::vector in C++, die das kann, Ich möchte keine TList, weil ich will, dass die Punkte zusammenhängend im Speicher liegen, damit ich nicht jeden Punkt einzeln an OpenGL übergeben muss, um die Call-Anzahl zu reduzieren.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Sa Mai 12, 2018 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Pellaeon hat geschrieben:
"?" ?

Array of <von irgendwas>, normales Delphi-Feature?
Dies ist schon seiter Delphi 2 dabei.

Was ist m_points kannst du mal die Deklaration zeigen ?

Folgendes Beispiel zeigt, das nur der Pointer und nicht die ganze Array kopiert wird. Vielleicht kannst du bei dir einfach das @ weglassen.
Code:
  1. var
  2.   i:Integer;
  3.   a1, a2:array of Byte;
  4. begin
  5.   SetLength(a1, 10);
  6.   for i:= 0 to 9 do  a1[i] := 0;
  7.   a2 : =a1;
  8.   for i:= 0 to 9 do  a2[i] := i;
  9.  
  10.   for i:= 0 to 9 do WriteLn(a1[i]);  

Das TPoint eine Klasse ist, dies wäre mir neu. TPoint ist ein Record mit Type-Helper Funktionen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Sa Mai 12, 2018 23:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Das TPoint ist eine von mir selbst definierte Klasse und nicht eine aus den Delphi-Systemklasse. Sorry, hätte ich oben genauer hinschreiben sollen.

Wenn ich das @weglasse, gibt es auch einen Compilefehler.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: So Mai 13, 2018 07:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Was ist dein Ziel ?

Willst du schlussendlich eine Punktearray an OpenGL übergeben ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: So Mai 13, 2018 13:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Ich habe eine procedure, welche DXF-Dateien einliest und Grafikobjekte erstellt. Die Grafikobjekte sind Klassen von mir (TTriangle, TPolyline, usw.)
Die Klassern erwarten im Konstruktur ein Array von Punkten. Bisher habe ich da "Array of" genutzt und als Typ eben meinen TPoint. Das kompiliert nun eben im neuen Delphi bei dieser einen Zuweiseung nicht mehr (siehe meinen Post oben).
Da ich das also jetzt eh anpassen muss, will ich von der TPoint-Klasse weg und stattdessen ein Punkt-Record benutzen. Wenn ich das als Array habe, kann ich es mit einem Call dann an OpenGL übergeben (anstatt wie bisher mit einer for-Schleife jeden Punkt einzeln, da TPoint ja eine Klasse ist bisher und ich im Array nur die Adressen der Instanzen habe).
Bei der Übergabe im Konstruktur möchte ich gerne das Array übernehmen/klauen können. Weil die procedure, welche die Daten aus der DXF-Datei erstellt, braucht ja das Array dann nicht mehr, also kann z. B. TPolyline das bekommen, anstatt immer alles zu kopieren.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: So Mai 13, 2018 15:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
und stattdessen ein Punkt-Record benutzen. Wenn ich das als Array habe, kann ich es mit einem Call dann an OpenGL übergeben (

Mit einem Typen-Helper kann man so was sehr elegant lösen.

Code:
  1. type
  2.   TPoints = array of record
  3.     x, y:Integer;
  4.  
  5.   end;
  6.   TPointsHelper = type Helper for TPoints
  7.     procedure Add(Ax,Ay:Integer);
  8.     procedure Draw(ACanvas:TCanvas);
  9.   end;
  10.  
  11.   var Punkte: TPoints;
  12.  
  13.   procedure TPointsHelper.Add(Ax, Ay: Integer);
  14.   var
  15.     l: Integer;
  16.   begin
  17.     l := Length(Self);
  18.     SetLength(Self, l + 1);
  19.     Self[l].x := Ax;
  20.     Self[l].y := Ay;
  21.   end;
  22.  
  23.   procedure TPointsHelper.Draw(ACanvas: TCanvas);
  24.   var
  25.     i: Integer;
  26.   begin
  27.     ACanvas.MoveTo(Self[i].x, Self[i].y);
  28.     for i := 1 to Length(Self) - 1 do ACanvas.LineTo(Self[i].x, Self[i].y);
  29.   end;
  30.  
  31. procedure TForm1.Button1Click(Sender: TObject);
  32. begin
  33.   Punkte.Add(Random(200), Random(200));
  34. end;
  35.  
  36. procedure TForm1.Button2Click(Sender: TObject);
  37. begin
  38.   Punkte.Draw(Canvas);
  39. end;


Sowas kannst du dann sehr elegant an OpenGL übergeben.
Code:
  1. glBufferData(..., Pointer(Punkte), ...);

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TArray weiterreichen
BeitragVerfasst: Mo Mai 14, 2018 21:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hallo,

erstmal danke für eure Zeit und eure Geduld. Ich habe das jetzt erst einmal mit System.TArray umgesetzt, damit es wieder kompiliert. Im Debugger habe ich mir die Zuweisung angeschaut und muss eine Aussage von oben revidieren. Wenn man zwei TArrays zuweist, findet kein tiefes Kopieren des Arrays statt. Die beiden TArray-Variablen verhalten sich wie (Objekt-)Zeiger. Auf der Seite, wo ich also gelesen habe, dass ein Kopieren des Feldes stattfindet, steht etwas falsches. Daher ist mein Ziel mit System.TArray ja erreicht :)


VG

Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 30 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.077s | 18 Queries | GZIP : On ]