Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehrdim. Dyn. Array of TMyType echt kopieren (https://www.delphipraxis.net/26115-mehrdim-dyn-array-tmytype-echt-kopieren.html)

dizzy 18. Jul 2004 17:26


Mehrdim. Dyn. Array of TMyType echt kopieren
 
Hi!

Ich versuche schon die ganze Zeit ein dynamisches Array dass ein Feld meines Formulars ist in eine lokale Prozedurvariable "echt" zu kopieren.
Zur Zeit mache ich das über eine Doppelschleife (da 2D-Array):
Delphi-Quellcode:
type
  TMyType = record
    x, y: double;
  end;

  TForm1 = class(TForm)
  ...
  Grid: array of array of TMyType;
  end;

.
.
.

procedure DoSomething;
var x, y: integer;
    LGrid: array of array of TMyType;
begin
  SetLength(LGrid, Length(Grid), Length(Grid[0]));
  for y := 0 to Length(LGrid[0])-1 do
  begin
    for x := 0 to Length(LGrid)-1 do
    begin
      LGrid[x,y].x := Grid[x,y].x;
      LGrid[x,y].y := Grid[x,y].y;
    end;
  end;
end;
Das finde ich allerdings ziemlich unschön. Copy aber meckert, dass der Parameter nicht möglich sei (wobei in der OH steht, dass dyn. Arrays auch gehen (aber wohl keine mehrdim.)), und mit Move produziere ich dauernd Zugriffsverletzungen :?
So hab ich's versucht:
Delphi-Quellcode:
SetLength(LGrid, Length(Grid), Length(Grid[0]));
Move(Grid, LGrid, Length(Grid) * Length(Grid[0]) * SizeOf(TMyType);
Habe auch mal versucht nicht bei Grid und LGrid "array of array of TMyType" zu schreiben, sondern hab nen Typ dafür gemacht. Aber in beiden Fällen gibt das leider eine AV an Adresse 0x00000000. Wie kann ich denn mehrdim. dyn. Arrays auf einen Schlag kopieren?

Danke euch schon mal!
dizzy

xineohp 18. Jul 2004 18:35

Re: Mehrdim. Dyn. Array of TMyType echt kopieren
 
moin,

also bei mir funzt es mit copy perfekt!
Delphi-Quellcode:
type
  tmytype = record
   x,y: integer;
  end;

var
a,b: array of array of tmytype;

setlength(a,100,100);
b := copy(a);
setlength(a,0,0);

dizzy 18. Jul 2004 18:51

Re: Mehrdim. Dyn. Array of TMyType echt kopieren
 
Tatsache! Sowatt...

Nur leider leider ist es wohl doch keine ganz echte Kopie! Es werden nur die Referenzen auf die ganzen MyTypes kopiert, aber die MyTypes nicht :?

Wie mach ich denn das jetzt?

Chewie 18. Jul 2004 19:14

Re: Mehrdim. Dyn. Array of TMyType echt kopieren
 
Versuch mal, jedes Element der ersten Dimension (also jedes Array of TMyTpe) mit Copy zu kopieren.

dizzy 18. Jul 2004 23:09

Re: Mehrdim. Dyn. Array of TMyType echt kopieren
 
Aha! Das geht wohl! Eine echte Kopie entsteht dann! Cool! Zumindest schon mal eine Schleife gespart. Dank'schö! Gibt es evtl. noch eine weitere Möglichkeit diesen Speicherblock der ja eigentlich (virtuell) zusammenhängen sein müsste, da auf einen Schlag alloziiert, mit einem Rutsch zu duplizieren?

Habe es jetzt auch mal mit einem 1D-Array probiert, nur ist die Verwaltung der Indezes mit mod und dem ganze Schnickschnack wieder dermaßen unübersichtlich, unschön und zu dem dann auch nicht mehr wirklich schneller :?

Könnte man da evtl. mit BitBlt dran gehen? Wie könnte sowas dann aussehen?

Chewie 19. Jul 2004 08:26

Re: Mehrdim. Dyn. Array of TMyType echt kopieren
 
Dyn. Arrays funktionieren nicht nur etwas anders als statische, sie liegen auch anders im Speicher. Ein Array of Array of TMyType speichert in jedem Element eine Variable vom Typ Array of TMyType. Da eine Variable eines solchen Typs aber nur ein Zeiger auf das eigentliche Array ist, hast du folgluch ein ein Array of Pointer. Nur die unterste Stufe (also hier das Array of TMyType) liegt zusammenhängend im Speicher.
Du brauchst bei dynamischen Arrays also immer n-1-Schleifen, wenn n die Anzahl der Dimensionen ist.

dizzy 19. Jul 2004 11:14

Re: Mehrdim. Dyn. Array of TMyType echt kopieren
 
Okay, danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.

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