Deather Опубликовано 24 декабря, 2006 Жалоба Поделиться Опубликовано 24 декабря, 2006 В конструкции var n,i:integer; a,b:array [1..n] of real; выскакиевает ошибка Error 133 Cannot evaluate this expression (Нельзя вычислить данное выражение). Ошибку выдает за конструкцией [1..n]. в чем фишка? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 24 декабря, 2006 Жалоба Поделиться Опубликовано 24 декабря, 2006 (изменено) Deather: Нельзя вычислить данное выражениеКомпилятор прав. Ему надо отвести n ячеек памяти для массива. А чему равно n?При объявлении массива его границы должны быть заданы числами или константами, или хотя бы выражениями из них, которые компилятор может вычислить. P.S. Переменные и массивы делятся на статические и динамические. Память для статических переменных и массивов распределяется перед выполнением программы, поэтому их размеры должны быть известны до выполнения программы. Память для динамических переменных и массивов распределяется во время выполнения программы обращением к операционной системе с просьбой выделить дополнительно необходимую память. Обычные объявления - для статических переменных и массивов. А динамические создаются вызовом специальных процедур и имеют некоторые особенности, так как обращение к ним осуществляется через так называемые указатели. Изменено 25 декабря, 2006 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Deather Опубликовано 25 декабря, 2006 Автор Жалоба Поделиться Опубликовано 25 декабря, 2006 Спасибо за ответы, поменяем условия задачи. Есть массив с неопределенным количеством ячеек, количество которых определяется оператором во время исполнения задачи. Подскажите сруктуру динамического массива. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 25 декабря, 2006 Жалоба Поделиться Опубликовано 25 декабря, 2006 (изменено) 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 ячеек. А что обычно в нем будет использоваться значительно меньше ячеек - ну и пусть часть выделенной программе памяти остается неиспользованной. Изменено 25 декабря, 2006 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения