Autor Beitrag
Mortal-Shadow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: Sa 09.10.10 18:38 
Hi,

ich war etwas am ausprobieren mit dynamischen Arrays.
Dabei ist mir aufgefallen, dass folgender Code zu funktionieren scheint:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Mortal-Shadow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 09.10.10 23:42 
Und wieder nur die halbe Information: WAS für eine Exception wurde geworfen?

Für diesen Beitrag haben gedankt: BenBE
Mortal-Shadow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: 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 ....'"
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 10.10.10 15:54 
Eoutofrange, Eoutofmemory, ...

Für diesen Beitrag haben gedankt: BenBE