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, 5, 20000); 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, ...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!