Entwickler-Ecke

Sonstiges (Delphi) - Mehrdimensionale dynamische Arrays


Mortal-Shadow - Sa 09.10.10 18:38
Titel: Mehrdimensionale dynamische Arrays
Hi,

ich war etwas am ausprobieren mit dynamischen Arrays.
Dabei ist mir aufgefallen, dass folgender Code zu funktionieren scheint:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
i: Array of Array of Integer;
begin
setlength(i, 5);
setlength(i[4], 2);
i[4,2000]:= 3;

Eine Exception schmeist er erst bei noch hören werten für den Arrayzugriff.
Was läuft da schief?

Darauf gekommen bin ich, da ich für opengl Polygone speichern wollte, und sehen wollte ob die einzelnen SubArrays unterschiedlich groß werden können. (also ob setlength(i[3], 4 nicht auch die größe von i[2] verändert)
Nun aber: warum schmeist er da vorher keine Exception?


BenBE - Sa 09.10.10 22:16

Kurze Antwort: Weil er's nicht prüft.

Längere Antwort: Weil er erst bei höheren Indizes in Bereiche kommt, die noch nicht vom Programm alloziiert wurden und damit theoretisch noch auf gültigen Speicher zeigen. Was man tun kann, ist die Bereichsprüfung bei Array-Zugriffen einzuschalten (Siehe Projekt-Optionen), was allerdings extrem an der Performance frisst.

Und ja: Jedes Sub-Array eines dynamischen Arrays kann unterschiedlich lang sein. Möchte man alle Arrays gleich lang haben, kann man SetLength(a, 520000); verwenden.


Mortal-Shadow - Sa 09.10.10 23:37

Ahh, vielen Dank.
Es hat mich halt gewundert, dass es halt ab ner gewissen größe
dann doch ne Exception geschmissen hat.
Aber gibt wohl Sinn so.
Mfg.


Delete - Sa 09.10.10 23:42

Und wieder nur die halbe Information: WAS für eine Exception wurde geworfen?


Mortal-Shadow - So 10.10.10 15:53

Eine Acces-Violation.
Was sollte er sonst bei Zugriffen auf falschen Speicherbereich noch schmeisen?

"... raised exception class EAccessViolation with message 'Access Violation at ....'"


Delete - So 10.10.10 15:54

Eoutofrange, Eoutofmemory, ...