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
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
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:
procedure TPolyLine.init(var newPoints : Array of TPoint; newCount : cardinal);
var i : cardinal;
collLine : TCollObject;
begin
m_count := newCount;
m_points := @newPoints;
m_width := 1;
...
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
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
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
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.