Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Object-Pascal / Delphi-Language (https://www.delphipraxis.net/35-library-object-pascal-delphi-language/)
-   -   Prism Multidimensionale Arrays unter .NET initialisieren (https://www.delphipraxis.net/29660-multidimensionale-arrays-unter-net-initialisieren.html)

sakura 12. Sep 2004 19:04


Multidimensionale Arrays unter .NET initialisieren
 
Hi,

durch Zufall bin ich in Delphi 8 auf ein interessantes Konstrukt gestoßen, wie man Arrays schnell initialisieren kann.
Delphi-Quellcode:
procedure TWinForm.Button1_Click(sender: System.Object; e:
System.EventArgs);
type
  TSimpleArray = Array of Byte;
  TMulitDimArray = Array of Array of Byte;
var
  SimpleArray: TSimpleArray;
  MulitDimArray: TMulitDimArray;
begin
  // reserviert 0..255 Bytes
  SimpleArray := New(TSimpleArray, 256);
  // reserver [0..19, 0..49] Bytes
  MulitDimArray := New(TMulitDimArray, 20, 50);
  ...
end;
Dieses Feature ist nicht in der Delphi-Hilfe dokumentiert, wird allerdings in den Delphi-Source-Codes genutzt, scheint wohl okay zu sein, dass dann auch zu nutzen :stupid:

...:cat:...

Christian S. 12. Sep 2004 22:06

Re: Multidimensionale Arrays unter .NET initialisieren
 
Macht SetLength nicht dasselbe? :gruebel: Oder gibt es das unter WinForms nicht mehr? (Habe D8 gerade nicht drauf.)

sakura 13. Sep 2004 08:26

Re: Multidimensionale Arrays unter .NET initialisieren
 
Zitat:

Zitat von Christian S.
Macht SetLength nicht dasselbe? :gruebel: Oder gibt es das unter WinForms nicht mehr? (Habe D8 gerade nicht drauf.)

Ja, tut es, allerdings finde ich es interessant, dass New() dahingehend erweitert wurde ;)

...:cat:...

sakura 13. Sep 2004 15:35

Re: Multidimensionale Arrays unter .NET initialisieren
 
Zitat:

Zitat von sakura
Zitat:

Zitat von Christian S.
Macht SetLength nicht dasselbe? :gruebel: Oder gibt es das unter WinForms nicht mehr? (Habe D8 gerade nicht drauf.)

Ja, tut es...

Doch nicht ganz ;-) SetLength erstellt den neu reservierten Bereich für multidimensionale Arrays nicht unbedingt in einem gesamten Speicherbereich zur Verfügung. Ausserdem ist der Overhead bei SetLength um einiges größer als bei New :-)

...:cat:...

Robert_G 13. Sep 2004 21:17

Re: Multidimensionale Arrays unter .NET initialisieren
 
Zitat:

Zitat von sakura
Zitat:

Zitat von sakura
Zitat:

Zitat von Christian S.
Macht SetLength nicht dasselbe? :gruebel: Oder gibt es das unter WinForms nicht mehr? (Habe D8 gerade nicht drauf.)

Ja, tut es...

Doch nicht ganz ;-) SetLength erstellt den neu reservierten Bereich für multidimensionale Arrays nicht unbedingt in einem gesamten Speicherbereich zur Verfügung. Ausserdem ist der Overhead bei SetLength um einiges größer als bei New :-)

...:cat:...

SetLength wird, wie das von dir entdeckte New, nix anderes machen können als Array.CreatInstance aufzurufen. ;)
Warum also nicht gleich so, damit hat man wesentlich mehr Kontrolle über den Array (zum Bleistift kann man auch die LowerBounds definieren. ;)
Code:
            byte[,] Miep;

            Miep = Array.CreateInstance(typeof(byte)
                                        // Längen
                                        , new int[2] { 15, 44 }
                                        // Startpunkte
                                        , new int[2] { 20, 40 } ) as byte[,];
           
            for (int i = 0; i < Miep.Rank; i++)
            {
                Console.WriteLine("Dimension {0} geht von {1} bis {2}"
                                 , i + 1
                                 , Miep.GetLowerBound(i)
                                 , Miep.GetUpperBound(i));
            }

            Console.WriteLine("Bitte zum Beenden den Any-Key suchen... :P");
            Console.ReadLine();
Code:
Dimension 1 geht von 20 bis 34
Dimension 2 geht von 40 bis 83
Bitte zum Beenden den Any-Key suchen... :P
Eine Instanz eines Arrays in der CLR hat IMHO eine statische Länge (wenn Herr Hejlsberg das sagt glaube ich das auch ;) ).
Da deshalb sowieso immer eine neue Instanz erzeugt werden muss, kann ich mir nichts vorstellen warum setLength langsamer sein sollte. (Würde mich aber brennend interessieren :firejump: )

sakura 13. Sep 2004 21:21

Re: Multidimensionale Arrays unter .NET initialisieren
 
Zitat:

Zitat von Robert_G
SetLength wird, wie das von dir entdeckte New, nix anderes machen können als Array.CreatInstance aufzurufen. ;)

Nein, sie arbeiten intern vollständig anders. SetLength erstellt erst das "äußere" Array und anschließend die inneren, somit ist kein zusammenhängender Speicherblock garantiert. New hingegen erstellt den kompletten Array mit allen Sub-Arrays "auf einen Schlag" und kann somit einen zusammenhängenden Speicherblock erstellen und ist schneller.

Diese Information habe ich aus einer Email von Rudy Velthuis (aus dem TeamB)

...:cat:...

Robert_G 13. Sep 2004 21:33

Re: Multidimensionale Arrays unter .NET initialisieren
 
Zitat:

Zitat von sakura
Zitat:

Zitat von Robert_G
SetLength wird, wie das von dir entdeckte New, nix anderes machen können als Array.CreatInstance aufzurufen. ;)

Nein, sie arbeiten intern vollständig anders. SetLength erstellt erst das "äußere" Array und anschließend die inneren, somit ist kein zusammenhängender Speicherblock garantiert.

Uff :shock: Das klingt ja fast wie eine Vergewaltigung der Array-Klasse. :roll:
Das da sollte doch auch eine sofortige Initialisierung bewirken:
Delphi-Quellcode:
type HilfsTyp = array of byte;
var
  Miep :HilfsTyp;
begin
  Miep := HilfsTyp.Create(1, 2, 3, 4, 08, 15);
end;
Ich weiß jetzt aber nicht, ob es mit mehrdimensionalen oder jagged Arrays in D8 klappt. (bin halt kein wirklicher .Net-Delphianer :oops: )

Zitat:

Zitat von sakura
Diese Information habe ich aus einer Email von Rudy Velthuis (aus dem TeamB)

Wäre echt genial, falls du da noch mehr Infos rauskitzeln könntest... :angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 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