Deather Posted December 24, 2006 Report Share Posted December 24, 2006 В конструкции var n,i:integer; a,b:array [1..n] of real; выскакиевает ошибка Error 133 Cannot evaluate this expression (Нельзя вычислить данное выражение). Ошибку выдает за конструкцией [1..n]. в чем фишка? Link to comment Share on other sites More sharing options...
Тролль Posted December 24, 2006 Report Share Posted December 24, 2006 (edited) Deather: Нельзя вычислить данное выражениеКомпилятор прав. Ему надо отвести n ячеек памяти для массива. А чему равно n?При объявлении массива его границы должны быть заданы числами или константами, или хотя бы выражениями из них, которые компилятор может вычислить. P.S. Переменные и массивы делятся на статические и динамические. Память для статических переменных и массивов распределяется перед выполнением программы, поэтому их размеры должны быть известны до выполнения программы. Память для динамических переменных и массивов распределяется во время выполнения программы обращением к операционной системе с просьбой выделить дополнительно необходимую память. Обычные объявления - для статических переменных и массивов. А динамические создаются вызовом специальных процедур и имеют некоторые особенности, так как обращение к ним осуществляется через так называемые указатели. Edited December 25, 2006 by Тролль Link to comment Share on other sites More sharing options...
Deather Posted December 25, 2006 Author Report Share Posted December 25, 2006 Спасибо за ответы, поменяем условия задачи. Есть массив с неопределенным количеством ячеек, количество которых определяется оператором во время исполнения задачи. Подскажите сруктуру динамического массива. Link to comment Share on other sites More sharing options...
Тролль Posted December 25, 2006 Report Share Posted December 25, 2006 (edited) 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 ячеек. А что обычно в нем будет использоваться значительно меньше ячеек - ну и пусть часть выделенной программе памяти остается неиспользованной. Edited December 25, 2006 by Тролль Link to comment Share on other sites More sharing options...
Recommended Posts