Problem z pamięcią - AViolation i RunTime 216

0

Cześć. Mam pewien problem. Otóż sprawa wygląda tak:

Mam kilka tablic dynamicznych: generated, pom i tab.

I jest coś takiego:

//generated:=nil; - też było wcześniej
setLength(generated, form1.generateCountSpin.Value);

//tutaj pewna pętla - operacje na tablicy tab - tu wszystko ok

//porządna pętla:

for stat:=1 to form1.generateCountSpin.Value do
begin
//losowanie
 setLength(pom, 6);

//tu wypełnianie tablicy pom, za pomocą tablicy tab - wszystko ok


 sort(pom); //sortowanie tablicy pom

//dopisywanie do stringGrida
 generatedGrid.Cells[0, stat]:=intToStr(stat);
 generatedGrid.Cells[1, stat]:=generatedLabel.Caption;
 if stat<generateCountSpin.Value then
    generatedGrid.RowCount:=generatedGrid.RowCount+1;

 generatedCountLabel.Caption:=intToStr(generatedGrid.RowCount-1);
 application.ProcessMessages;

//to dopisywanie działa ok


//idzie do tablicy generated
 for i:=1 to 6 do
     generated[stat, i]:=pom[i];

 pom:=nil;

end; //for stat

tab:=nil;

Najczęściej AccessViolation pojawia się na samym początku, przy zwiększaniu rozmiarów tablicy generated.
Raz się pojawił gdzieś pod koniec przy uzupełnianiu tablicy generated lub pom:=nil, lub tab:=nil.

Opatrzyłem tą całość w blok try..except. No i jest tak, że za pierwszym razem wykonania tego kodu jest ok. Czasami za drugim też. Ale potem jest już błąd.

Poza tym, gdy zamykam program mam runtime 216. Co to jest?

I czemu wychodzi mi te Access Violation? Jak na moje oko, wszystko powinno być ok. Jak myślicie?

0

Po pobieżnej analizie widzę, że pom to tablica dynamiczna, a ty odwołujesz się do jej elementu o indeksie 6, podczas gdy ona ma 6 elementów ale największy indeks to 5. Czyli to :

for i:=1 to 6 do
     generated[stat, i]:=pom[i];

zamień na to :

for i:=0 to 5 do
     generated[stat, i]:=pom[i];

//DOPISANE
Hmm generated to chyba tablica dwuwymiarowa (taki wniosek wyciągnąłem z zapisu generated[stat, i]), a z kodu wynika, że ustawiasz długość tylko jednego jej wymiaru. AV może też być powodem tego, że nie ustawiasz drugiego wuymiaru.

1 użytkowników online, w tym zalogowanych: 0, gości: 1