![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка индекса для массива
learner © (2006-10-02 23:08:00)Был глюк в програме. Еле нашла место.
Эта процедура не всегда срабатывала правильно ( когда ей захочется )
При верных индексах выдавала False
function QueryIndex(const i, j: integer; const Arr: TDblInfoArr): Boolean;
begin
Result:=(i in [Low(Arr)..High(Arr)]) and (j in [Low(Arr[i])..High(Arr[i])]);
end;
Переписала ее:
function QueryIndex(const i, j: integer; const Arr: TDblInfoArr): Boolean;
var
Test: Boolean;
begin
Result:=(i in [Low(Arr)..High(Arr)]) and (j in [Low(Arr[i])..High(Arr[i])]);
Test:=(i >= Low(Arr)) and (i <= High(Arr)) and (j >= Low(Arr[i])) and (j <= High(Arr[i]));
if Result <> Test
then ShowMessage(IntToStr(i) + '=' + IntToStr(j) + #13#10 +
IntToStr(Low(Arr)) + '=' + IntToStr(High(Arr)) + #13#10 +
IntToStr(Low(Arr[i])) + '=' + IntToStr(High(Arr[i])));
end;
И, иногда, выдается ошибка типа:
0=19
0=32
0=272
Тупо смотрю и не понимаю, как такое может быть ?
Или может мне уже в дворники пора ?
P.S.
На всякий случай
type
TInfo = record
// bala -bala
end;
TInfoArr = array of TInfo;
TDblInfoArr = array of TInfoArr;
learner (2006-10-03 10:32:00) [1]Спасибо !
guav (2006-10-02 23:24:00) [2]т.е. код
> Result:=(i in [Low(Arr)..High(Arr)]) and (j in [Low(Arr[i])
> ..High(Arr[i])]);
для массивов длинее 255 неверен. Не проверял, но предполагаю, что High(Arr) приводится к Byte, потому он всё же компилируется.
Для автоматической проверки диапазонов в рантайм с выбросом исключений при нарушении следует использовать {$RANGECHECKS ON}
guav (2006-10-02 23:20:00) [3]> (i in [Low(Arr)..High(Arr)])
Тип set ограничен 0..255, т.к. индексы могут не вписываться в диапазон, следует использовать вариант
> Test:=(i >= Low(Arr)) and (i <= High(Arr)) and (j >= Low(Arr[i])
> ) and (j <= High(Arr[i]));