Błąd "List index of out bound" - jak go naprawić?

0

Cześć.

Mam w klasie pole

Names : Array [1..2,1..3] of TList;

w liście są obiekty typu TName. Mam część procedury :

count := Names[ASex,ipopular].Count;
index := Random(count-1)+1;
Result := TName(Names[ASex,APopular][index]).Name;
 

gdzie count = 671, natomiast index = 458, natomiast przy :

 Result := TName(Names[ASex,APopular][index]).Name;

Dostaje wyjątek wyjścia poza tablice. Dlaczego ?

1

TList jak każda normalna tablica w każdym przyzwoitym języku ma indeksacje od 0

3

Trochę mało kodu, ale pewnie wystarczy zamienić tę linijkę:

index := Random(count-1)+1;

na taką:

index := Random(count);

Dzięki temu wylosujesz indeks itema od 0 do Count - 1, czyli bez wykroczenia poza zakres; Tak przy okazji - zmądrzej dzięki temu wątkowi i zacznij indeksować macierze od 0, tak jak przystało.

0

Nie wiedziałem, że listy są indeksowane od 0. Hmm to faktycznie czapa, ale nie w tym problem. Jak napisałem index jest mniejszy od ilości elementów. Dodatkowo nie pomogła zmiana proponowana przez @furiousprogramming. To aż dziwne, żebym nie mógł odnieść się do jakiegokolwiek elementu... jakieś inne pomysły ?

0

to wyglada dziwnie, ale mniejsza o to

 Result := TName(Names[ASex,APopular][index]).Name;

podstawiaj po kolei 0 pod kazdy indeks i znajdziesz blad

1
if not (ASex in [1..2]) then ShowMessage('ASex out of range');
if not (APopularin in [1..3]) then ShowMessage('APopular out of range');
if index>=Names[ASex,APopular].Count then ShowMessage('index out of range');
Result := TName(Names[ASex,APopular][index]).Name;
0

Zauważcie, że raz używam APopular, a raz ipopular. APopular to popularność, która zostaje przekodowana, na numer odpowiedniej tablicy - ipopular od internal. Po prostu wychodziłem za zakres bo zamiast ipopular użyłem APopular. Głupi błąd, ale zmylił mnie wyjątek z klasy list. Dzięki za zainteresowanie.

1

Czyli bezsensowne nazewnictwo zmiennych się kłania i prosi pozdrowić rodzinę.

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