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

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

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

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

Сообщение trexxet » 27.03.2014 01:42:34

Имеется такой код:
Код: Выделить всё
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-м веке есть такое архаистическое ограничение на статические массивы? Или я что-то делаю не так?
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

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

Сообщение SSerge » 27.03.2014 03:38:36

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

Добавлено спустя 5 минут 14 секунд:
Кстати, тип цикловой переменной i также неясен.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение Дож » 27.03.2014 13:11:33

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 был выбран какой-нибудь жлобский тип.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение qivi » 27.03.2014 14:45:49

Код: Выделить всё
for i := 0 to (CountryNum * 200)-1 do
не оно?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Frolik » 27.03.2014 15:07:58

Нет, киви, явно не оно. Границы массива четко заданы.
Сдается мне, джентельмены, что для i выбран тип byte.
Frolik
постоялец
 
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

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

Сообщение trexxet » 27.03.2014 16:26:28

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

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

Сообщение Дож » 27.03.2014 17:11:07

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


В 21-ом веке компиляторы иногда умнее людей :)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru
cron