Можно ли в PASCALе задать массив a:array[1..i,1..j]of real; где i,j-не константы, а переменные.Хотя бы в начале программы, когда известно, что массив есть, но еще не ясно какого размера.Например, вычисляем i и j, и создаем такой массив, а дальше i и j - const.
Добрый день, thirteenth! Нет, конечно, и это самая большая проблема Паскаля. Выход - завести тип "по-максимуму", точнее 2 типа:
Type TArray1 = array [1..maxJ] of Real; TArray2 = array [1..maxI] of Pointer;
и указатели на них: PArray1 = ^TArray1; PArray2 = ^TArray2;
Вводишь 2 нетипизированных указателя: p : Pointer;
Далее в программе вычисляешь i и j и пишешь следующий код: GetMem (p, i * SizeOf (Pointer)); for k := 1 to i do GetMem (PArray2 (p)^ [k], j * SizeOf (Real));
Доступ к элементу (k, m) осуществляется так: PArray1 (PArray2 (p)^ [k])^ [m]
В конце программы не забудь освободить память: for k := 1 to i do FreeMem (PArray2 (p)^ [k], j * SizeOf (Real)); FreeMem (p, i * SizeOf (Pointer));
Контроль за выходы индекса за пределы массива
придется осуществлять тебе самому. Ответ отправлен: 09.02.2004, 10:58 Отправитель: Ayl Отвечает Boriss
Доброе время суток, thirteenth! Нет :(( "Обычный" Паскаль таккого не разрешает, так как до выполнения первого оператора уже все должно быть известно. Выход! Разместить массив в динамической памяти (GetMem) и написать функции для работы с ним, то есть, передаете индексы массива, а подпрограмма отыскивает в памяти элемент. Для надежной работы лучше организовать все это в виде объекта. Можно посмотреть пример, который писал я http://www.borlpasc.narod.ru/Boris/1.htm Ответ отправлен: 09.02.2004, 10:41 Отправитель: Boriss Отвечает Tancho
Доброе время суток, thirteenth! Саммый простой случай - когда в a:array[1..i,1..j] of real, i,j переменные, но известный их горные границый т.е. заранее известно что индексый не превосходять какие там чисель. Тогда все просто.Смотри в Приложении.
Приложение: Ответ отправлен: 10.02.2004, 17:45 Отправитель: Tancho Отвечает vitya
Здравствуйте, thirteenth! 1. плохой вариант. Если массив всегда будет меньше определенного числа - тогда объявляешь константу N и задаешь массив array[1..N,1..N] of real. Потом просто используешь переменную для хранения настоящего размера. 2. вариант получше - создаешь указатель на real. Выделяешь n*n*sizeof(real) байт памяти и пишешь несложную функцию для доступа к [i, j] - ому элементу. Потом не забудь высвободить память. 3. ИМХО, лучший вариант - на основе ООП создаешь класс(объект) который инкапсулирует понятие матрицы - и работаешь с ним Ответ отправлен: 08.02.2004, 14:34 Отправитель: vitya Отвечает Pawel
Доброе время суток, thirteenth! Конкретно так a:array[1..i,1..j]of real указать нельзя. Толко с константами. Можно выделить память вручную. Можно описать свой тип, но это сложно. Ответ отправлен: 08.02.2004, 18:46 Отправитель: Pawel Отвечает sir henry
Приветствую Вас, thirteenth! Нет, так нельзя. Любые переменные, описаные в глобальном var'e, должны иметь заранее известный размер. Для Вашего случая подходят динамические списки или коллекции (TCOllection). Я предлагаю использовать именно коллекции, т.к. с ними проще работать, поскольку все методы (практически) для работы с ними уже определены, в то время как для динамических списков Вам понадобится самому описывать и разрабатывать их. Ответ отправлен: 09.02.2004, 05:36 Отправитель: sir henry Отвечает Andy
Здравствуйте, thirteenth! Ну прям так явно обьявить не получится, а вот создать динамический массив легко. Читай хелп по GetMem. Ответ отправлен: 09.02.2004, 05:41 Отправитель: Andy
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.