Длина массива

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Длина массива

Сообщение trexxet »

Имеется такой код:

Код: Выделить всё

UnitAvaliableList: array[1..( CountryNum * 200 )] of boolean;
...
  for i := 1 to CountryNum * 200 do
    UnitAvaliableList[i] := False;

Если CountryNum = 2, то на присвоении False получаю ошибку:
ueditor.pas(60,5) Error: range check error while evaluating constants

Если CountryNum = 1, то все работает нормально. Аналогично for i := 1 to CountryNum * 100 do работает и при CountryNum = 2. Отсюда возникают подозрения, что ошибка возникает, когда длина массива больше 256.
Неужели в 21-м веке есть такое архаистическое ограничение на статические массивы? Или я что-то делаю не так?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

trexxet
Что такое CountryNum? Что характерно, если это переменная, то весьма странно, что код вообще откомпилировался. Ибо массивы задаются исключительно константными значениями. Если константа, опять же, как определена? Const CountryNum=1; ? Если так, то смотрим: перемнжаются два значения, неопределенных типов, для каждого из которых принммается мимнимальная битовая величина, которыми они могут быть представлены. байт (0..256) умножается на байт. Результат (внимание!) должен быть тоже типа байт (0..256), а у вас получается больше. Отсюда и Range check error.
зы - вполне возможно, что сие есть баг компилятора, но imho логика появления ошибки та самая.

Добавлено спустя 5 минут 14 секунд:
Кстати, тип цикловой переменной i также неясен.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

SSerge писал(а):trexxet
Что такое CountryNum? Что характерно, если это переменная, то весьма странно, что код вообще откомпилировался. Ибо массивы задаются исключительно константными значениями. Если константа, опять же, как определена? Const CountryNum=1; ? Если так, то смотрим: перемнжаются два значения, неопределенных типов, для каждого из которых принммается мимнимальная битовая величина, которыми они могут быть представлены. байт (0..256) умножается на байт. Результат (внимание!) должен быть тоже типа байт (0..256), а у вас получается больше. Отсюда и Range check error.
зы - вполне возможно, что сие есть баг компилятора, но imho логика появления ошибки та самая.


Код: Выделить всё

[doj@korica ~/temp]$ cat arr.pas
const
  CountryNum = 2;
var
  UnitAvaliableList: array[1..( CountryNum * 200 )] of boolean;
begin
  Writeln(SizeOf(UnitAvaliableList));
end.
[doj@korica ~/temp]$ fpc -Cr arr.pas && ./arr
400


Кстати, тип цикловой переменной i также неясен.

Наши телепатические способности приходят к одному и тому же: для переменной I был выбран какой-нибудь жлобский тип.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Код: Выделить всё

for i := 0 to (CountryNum * 200)-1 do
не оно?
Frolik
постоялец
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Сообщение Frolik »

Нет, киви, явно не оно. Границы массива четко заданы.
Сдается мне, джентельмены, что для i выбран тип byte.
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Действительно недоглядел, i: byte. Спасибо.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Действительно недоглядел, i: byte. Спасибо.


В 21-ом веке компиляторы иногда умнее людей :)
Ответить