![]() |
AW: Array SCHNELL auf Null setzen
Also wie sieht denn nun der Code aus, um ein
Delphi-Quellcode:
zu füllen?
array of array of integer
Spontan:
Delphi-Quellcode:
Optimierungsvorschläge?
Procedure ZeroDynamicMatrix (aMatrix : TMatrix; rows, cols : Integer);
var i : Integer; NumberOfBytesPerRow : Integer; Begin setLength(aMatrix,rows); NumberOfBytesPerRow := cols*sizeof(aMatrix[0][0]); // sollte gehen, da compile time constant. for i:=0 to cols-1 do begin setLength(aMatrix[i], cols); FillChar(aMatrix[i][0], NumberOfBytesPerRow); end; end; |
AW: Array SCHNELL auf Null setzen
Was man noch machen kann, wenn das Array immer „rechteckig“ ist, ist, kein Array of Array zu nehmen, sondern den ganzen Speicherbereich am Stück anzufordern, und dann den Index von Hand (bzw. über entsprechende Getter und Setter) auszurechnen.
Statt:
Delphi-Quellcode:
So:
var a: array of array of integer;
SetLength(a, rows); for i := 0 to rows - 1 do SetLength(a[i], cols);
Delphi-Quellcode:
a[y,x] im ersten Beispiel entspricht dann a[y*cols + x] im zweiten Beispiel. Dadurch spart man erstens die Pointer-Dereferenzierungen auf der ersten Ebene, und außerdem ist der Zugriff auf die Elemente cacheeffizienter, weil es zwischendrin keine Lücken gibt. Beim naiven Ansatz könnte der Speichermanager die Unterarrays sonstwohin verstreuen.
var a: array of integer;
SetLength(a, rows*cols); Außerdem kann man das ganze Array dann mit einem einzigen Aufruf von FillChar nullen und braucht dazu keine äußere Schleife mehr. |
AW: Array SCHNELL auf Null setzen
Nach meinem Kenntnisstand ist der Delphi-Compiler intelligent genug um gleichförmige Arrays zu erkennen.
Statt:
Code:
formuliert man
for i := 0 to rows - 1 do
SetLength(a[i], cols);
Code:
Edit 1: Sorry, ich habe übersehen, dass das ja schon in #2 stand.
SetLength(a, rows, cols);
Edit 2: Leider ist der Compiler anscheinend doch zu doof. :-( ich bin frustriert. Vielleicht hätte ich bei Assembler bleiben sollen... |
AW: Array SCHNELL auf Null setzen
Was soll daran doof sein? Ein gleichförmiges zweidimensionales Array ist numal kein eindimensionales Array, obwohl man es als solches implementieren kann.
Und dann auch nur so weit, wie ich sichergehen kann, dass man nicht noch nachträglich eine Dimension verändert (dynamisch und so...) |
AW: Array SCHNELL auf Null setzen
Zitat:
|
AW: Array SCHNELL auf Null setzen
@Stevie:
Vielleicht war meine Formulierung zu hart. Ich hätte auch sagen können: Leider ist der Compiler nicht so schlau ein gleichförmiges mehrdimensionales dynamisches Array anders zu behandeln als ein ungleichförmiges mehrdimensionales dynamisches Array. Ohne dies jemals zu prüfen, ging ich bisher davon aus, dass die Sequenz
Code:
etwas anderes wäre als
a: array of array of Integer;
Code:
Ich habe jetzt gelernt: Sofern die Darstellung des Arrays im Speicher eine Rolle spielt, muss der Programmierer ein gleichförmiges mehrdimensionales dynamisches Array selbst verwalten (wie in #12 gezeigt).
a: array of TIntegerDynArray;
|
AW: Array SCHNELL auf Null setzen
Zitat:
Delphi-Quellcode:
wird also mit einem Aufruf von
arr: array of array of Integer
Delphi-Quellcode:
ebenso mit Nullen initialisiert wie ein eindimensionales.
SetLength(arr, 10, 20)
|
AW: Array SCHNELL auf Null setzen
Hallo,
also ich verlasse mich nicht auf automatisches Setzen des Compilers. Da wir Datenbankprogramme entwickeln, spielt der Overhead des Initialisierens hier überhaupt keine Rolle. Heiko |
AW: Array SCHNELL auf Null setzen
Zitat:
|
AW: Array SCHNELL auf Null setzen
Zitat:
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz