AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Object-Pascal / Delphi-Language Prism Multidimensionale Arrays unter .NET initialisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Multidimensionale Arrays unter .NET initialisieren

Ein Thema von sakura · begonnen am 12. Sep 2004 · letzter Beitrag vom 13. Sep 2004
Antwort Antwort
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#1

Multidimensionale Arrays unter .NET initialisieren

  Alt 12. Sep 2004, 20:04
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

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#2

Re: Multidimensionale Arrays unter .NET initialisieren

  Alt 12. Sep 2004, 23:06
Macht SetLength nicht dasselbe? Oder gibt es das unter WinForms nicht mehr? (Habe D8 gerade nicht drauf.)
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#3

Re: Multidimensionale Arrays unter .NET initialisieren

  Alt 13. Sep 2004, 09:26
Zitat von Christian S.:
Macht SetLength nicht dasselbe? 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

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#4

Re: Multidimensionale Arrays unter .NET initialisieren

  Alt 13. Sep 2004, 16:35
Zitat von sakura:
Zitat von Christian S.:
Macht SetLength nicht dasselbe? 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

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Multidimensionale Arrays unter .NET initialisieren

  Alt 13. Sep 2004, 22:17
Zitat von sakura:
Zitat von sakura:
Zitat von Christian S.:
Macht SetLength nicht dasselbe? 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

......
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 )
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#6

Re: Multidimensionale Arrays unter .NET initialisieren

  Alt 13. Sep 2004, 22:21
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)

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: Multidimensionale Arrays unter .NET initialisieren

  Alt 13. Sep 2004, 22:33
Zitat von sakura:
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 Das klingt ja fast wie eine Vergewaltigung der Array-Klasse.
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 )

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...
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 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