Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2012, 22:58   #1
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию Ошибка при объявлении массива(Ordinal type expected).

Доброго времени суток. Требуется совет\помощь.
Суть проблемы в разделе Объявлении массива.

Код:
A: array [1..100000] of integer;
(Ordinal type expected).
Использовал поиск, в поиске смотрю что народ объявляет преспокойно массивы даной длинны. Но не могу понять почему у меня выскакивает ошибка.

Ещё хотел добавить что суть ошибки мне ясна, пробовал менять скажем тип на Longint, но тоже не помогло и выбило ту же ошибку.

Для большей ясности того, что хотел сделать.
Инциализировать массив и изначально сделать его нулевым.
int a[0..10^5]={0...0};

И ещё такой вопрос, вот объявлен к примеру даный массив и вот как я его заполняю нулями.
Код:
var
A: array [1..100] of integer;
...
begin
FillChar(A,Sizeof(A),0);
...
end.
Правильно ли? И возможны ли другие варианты.

Заранее спасибо.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 27.07.2012, 23:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
FillChar(A,Length(A),0);
Так будет правильнее.
Цитата:
почему у меня выскакивает ошибка.
А точно на этой строке? Может действительно слишком большой размер просишь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2012, 23:23   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
FillChar(A,Length(A),0);
Так будет правильнее.
Почему? FillChar'у надо количество байт - это SizeOf.
Somebody вне форума Ответить с цитированием
Старый 27.07.2012, 23:25   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Somebody
Верно заметил. Это для динамических нужно указывать Length.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2012, 02:11   #5
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
в поиске смотрю что народ объявляет преспокойно массивы даной длинны
Компилятор какой у народа? А у тебя? При использовании 32-битного компилятора никаких проблем с объявлением массива такого размера не будет. А вот в 16-битном - проблема. Даже две.

Первая - при описании индекса массива все то, что выходит за границу 65535 перестает быть перечислимым типом. Скажем, если нижняя граница индексов положительная - то верхняя не может превышать 65535, все, что выше - выходит за границы перечислимого типа (т.е., диапазон значений типа Word). Если же нижняя отрицательная - то верхняя может быть только до 32767 (т.е., диапазон значений типа Integer)

Но проблем с этим при программировании на Турбо Паскале нет, потому что есть вторая проблема: ни размер одной переменной, ни общий размер всех статических переменных не может превышать размер сегмента. То есть, даже если ты опишешь array[1 .. 40000] of Integer - это не вызовет ошибки "Ordinal type expected", зато вызовет другую: "Structure too large", ибо размер такого массива больше чем 65535 байт.

Последний раз редактировалось volvo877; 28.07.2012 в 02:15.
volvo877 вне форума Ответить с цитированием
Старый 28.07.2012, 04:11   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Леший, ответь, плз, на вопрос volvo877 - какой компилятор у тебя? И старайся всегда это указывать, если вопрос по его сообщению об ошибке.
А вооще - опять же, по словам volvo877 - раскрути над головой и забрось подальше свои 16-битные компиляторы. Скачай себе FP и радуйся ЖИЗНИ, а не тому, что де удалось на старой кобыле путем многочисленных ухищрений таки перевезти 10 тонн кирпичей..
Цитата:
Сообщение от Leshii Посмотреть сообщение
объявлен к примеру даный массив и вот как я его заполняю нулями.
Код:
var
A: array [1..100] of integer;
...
begin
FillChar(A,Sizeof(A),0);
...
end.
Правильно ли? И возможны ли другие варианты.
Способ и правильный, и самый быстрый, но годится только
1. либо для заполнения массивов of byte/char,
2. либо для для заполнения нулями.
Если тебе вдруг понадобится заполнять единицами или еще чем-то масив of integer, то таким способом ты получишь совсем не то. Нужно использовать обычный цикл по индексам массива, от мала до велика.

А вообще, заполнение нулями глобальных пременных совершенно не оязательно. Система делает это и без тебя, не вижу смысла повторять. Если же твой массив описан внутри процедуры или функции - тогда да, он будет содержать мусор, и инициализация нужна (если она нужна, конечно)).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 28.07.2012, 21:11   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
А вообще, заполнение нулями глобальных пременных совершенно не оязательно. Система делает это и без тебя, не вижу смысла повторять.
А если система не сделает? FreePascal как раз, в отличие от Turbo Pascal'я и Delphi, может не инициализировать глобальные переменные.
Somebody вне форума Ответить с цитированием
Старый 28.07.2012, 22:05   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А если система не сделает?
Тогда циклом
Самое надежное хотя и пожалуй медленное действо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2012, 11:56   #9
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Ответ на вопрос volvo877
Турбо Паскаль 7.0, и таки да, 16-битный (

Stilet, ошибка у меня возникала именно в
Код:
A: array [1..100000] of integer;
этом месте.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 31.07.2012, 02:22   #10
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
А если система не сделает? FreePascal как раз, в отличие от Turbo Pascal'я и Delphi, может не инициализировать глобальные переменные.
Что значит "если не сделает"? Приведи пример, когда в FP этого не произошло. Повторяю: это делает не FreePascal, и не Turbo. Это делает системный загрузчик. И это есть требование безопасности системы - защита от подглядывания одного процесса за другим. Если этого не будет, подглядывающая программа может сканировать выделенную ей системой память в поисках нестертых паролей и номеров кредиток.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Unit1.pas(100): Statement expected, but expression of type 'Boolean' found sedoq Общие вопросы Delphi 3 08.02.2012 01:27
Ошибка при объявлении файла записей bogdanidze Помощь студентам 2 13.05.2011 08:26
Type name expected почему? ImmortalAlexSan Общие вопросы C/C++ 3 10.02.2011 21:32
ошибка при обработке функции класса "missing type specifier - int assumed" askerpro Общие вопросы C/C++ 8 02.06.2010 23:09
Ошибка в объявлении переменных Superlotles Помощь студентам 1 17.12.2009 17:05