AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array SCHNELL auf Null setzen

Ein Thema von bernhard_LA · begonnen am 20. Okt 2014 · letzter Beitrag vom 21. Okt 2014
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#1

AW: Array SCHNELL auf Null setzen

  Alt 20. Okt 2014, 14:30
Dann sprechen wir von unterschiedlichen Delphi-Versionen,

...

Das scheint aber nicht mehr zu stimmen, ob es aber garantiert werden kann, dass der Speicher in jedem Fall gelöscht wird?
Das Verhalten ist auch schon in Delphi 7 so (ältere kann ich gerade nicht überprüfen). Ich gehe jetzt mal einfach davon aus, daß es in den zwischen D7 und XE7 liegenden Versionen ebenso ist. Natürlich kann niemand garantieren, daß dieses Verhalten in zukünftigen Versionen wieder anders implementiert wird, aber die Wahrscheinlichkeit ist eher gering. Sollte es wirklich mal soweit sein, wird man dann wohl aktiv werden müssen. Bis dahin sind sämtliche 0-Initialisierungen dynamischer Arrays im eigenen Code überflüssig.

Um auf die Originalfrage zurückzukommen: Himitsu's Vorschlag mit dem erweiterten SetLength ist die schnellste Möglichkeit.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
D-User

Registriert seit: 19. Dez 2006
Ort: NRW
56 Beiträge
 
#2

AW: Array SCHNELL auf Null setzen

  Alt 20. Okt 2014, 17:39
was vllt auch noch erwähnt werden sollte:
bei größeren Arrays könnte es sich lohnen, dies ggf. mittels move umzusetzen, die greift per assembler auf mov zu, könnte noch mal einen Speed-Schub geben.
Hat nat. zur Voraussetzung, dass man irgendwo vorher einen Speicherbereich 0en hat und wird wohl auch nur dann sinnvoll, wenn mehr als ein mal aufgerufen wird (weil der initiale Bereich ja auch gefüllt werden muss, oder man findet vllt trickreich schon einen existierenden ).
Denk ich jetzt mal so.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Array SCHNELL auf Null setzen

  Alt 21. Okt 2014, 05:13
Also wie sieht denn nun der Code aus, um ein array of array of integer zu füllen?
Spontan:
Delphi-Quellcode:
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;
Optimierungsvorschläge?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Array SCHNELL auf Null setzen

  Alt 21. Okt 2014, 06:06
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:
var a: array of array of integer;

SetLength(a, rows);

for i := 0 to rows - 1 do
  SetLength(a[i], cols);
So:
Delphi-Quellcode:
var a: array of integer;

SetLength(a, rows*cols);
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.

Außerdem kann man das ganze Array dann mit einem einzigen Aufruf von FillChar nullen und braucht dazu keine äußere Schleife mehr.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#5

AW: Array SCHNELL auf Null setzen

  Alt 21. Okt 2014, 07:47
Nach meinem Kenntnisstand ist der Delphi-Compiler intelligent genug um gleichförmige Arrays zu erkennen.
Statt:
Code:
for i := 0 to rows - 1 do
   SetLength(a[i], cols);
formuliert man

Code:
SetLength(a, rows, cols);
Edit 1: Sorry, ich habe übersehen, dass das ja schon in #2 stand.
Edit 2: Leider ist der Compiler anscheinend doch zu doof. ich bin frustriert. Vielleicht hätte ich bei Assembler bleiben sollen...

Geändert von samso (21. Okt 2014 um 08:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.042 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Array SCHNELL auf Null setzen

  Alt 21. Okt 2014, 08:42
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...)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#7

AW: Array SCHNELL auf Null setzen

  Alt 21. Okt 2014, 09:16
@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:
a: array of array of Integer;
etwas anderes wäre als
Code:
a: array of TIntegerDynArray;
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).
  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 02:14 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 by Thomas Breitkreuz