Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Error 133


Рекомендуемые сообщения

В конструкции

var n,i:integer;

a,b:array [1..n] of real;

выскакиевает ошибка Error 133 Cannot evaluate this expression (Нельзя вычислить данное выражение). Ошибку выдает за конструкцией [1..n]. в чем фишка?

Ссылка на комментарий
Поделиться на другие сайты

Deather:

Нельзя вычислить данное выражение
Компилятор прав. Ему надо отвести n ячеек памяти для массива. А чему равно n?

При объявлении массива его границы должны быть заданы числами или константами, или хотя бы выражениями из них, которые компилятор может вычислить.

P.S. Переменные и массивы делятся на статические и динамические. Память для статических переменных и массивов распределяется перед выполнением программы, поэтому их размеры должны быть известны до выполнения программы. Память для динамических переменных и массивов распределяется во время выполнения программы обращением к операционной системе с просьбой выделить дополнительно необходимую память.

Обычные объявления - для статических переменных и массивов. А динамические создаются вызовом специальных процедур и имеют некоторые особенности, так как обращение к ним осуществляется через так называемые указатели.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Спасибо за ответы, поменяем условия задачи. Есть массив с неопределенным количеством ячеек, количество которых определяется оператором во время исполнения задачи. Подскажите сруктуру динамического массива.

Ссылка на комментарий
Поделиться на другие сайты

Deather:

const kn=10000;type DynArray=array [1..kn] of Real; { 10000 - максимальный возможный в нашем примере размер массива }{ фактически будет выделяться столько, сколько потребуем, но не больше 10000 } var n:Integer; a,b:^DynArray; begin repeatWrite('Length of every array? '); ReadLn(n); if n>kn then WriteLn ('Maximum is ',kn,' !'); until n<=kn;GetMem(a,n*SizeOf(Real)); GetMem(b,n*SizeOf(Real));{ два динамических массива заданного размера созданы }{ дальше - пример использования элемента массива }a^[1]:=3.14; WriteLn(a^[1]:8:2);{ значок ^ можно после создания переменной или массива толковать как часть имени, }{	 показывающую, что это - имя динамической переменной или массива }ReadLn;end.

P.S. Но для простоты часто просто берут большой статический массив, из которого используют только часть ячеек. Например, если будет нужно максимально 400 ячеек, то и берут массив на 400 ячеек. А что обычно в нем будет использоваться значительно меньше ячеек - ну и пусть часть выделенной программе памяти остается неиспользованной.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...