Доброе время суток, люди. Подскажите начинающему: Нужно написать процедуру, которая грузит imge из BMP-файла на момент написания программы границы этого массива не известны, как передать этот массив в процедуру? Может быть есть какой - то синтаксис типа array of byte, только для 2-м массива?
Добрый день, Pavel! Тут нужно пользоваться динамическими массивами. Создаёшь указатель на одномерный массив, затем выделяешь память GetMem'ой и пользуешься. Об этом подробно писалось здесь уже много раз (вопрос извечный), поэтому заходите на сайт и ищите. Ответ отправлен: 13.03.2004, 02:54 Отправитель: Strory Отвечает Andy
Добрый день, Pavel! Можно передать массив как указатель на первый элимент и его размерности... так как массив располагается последовательно в памяти, то зная размер элимента можно легко вычислить индец элемента.
Приложение: Ответ отправлен: 12.03.2004, 05:02 Отправитель: Andy Отвечает Vitally
Здравствуйте, Pavel! Делается это примерно так: создаете запись и массив из одного элемента типа этой записи. Затем, выделяете память под нужное кол-во элементов. Обязательно нужно отключить проверку "допустимости индексов массива" (Range Cheking). См. Приложение.
Приложение: Ответ отправлен: 11.03.2004, 21:17 Отправитель: Vitally Отвечает sir henry
Приветствую Вас, Pavel! В Паскале такого нету. Обычно в этих случаях используется выделение динамической памяти, типа GetMem(имя_указателя_на_структуру, размер_структуры). Ответ отправлен: 12.03.2004, 07:50 Отправитель: sir henry Отвечает Ayl
Доброе время суток, Pavel! Должен тебя огорчить. В качестве открытых параметров допускаются только одномерные массивы. То есть тебе придется как-нибудь извращаться самому. Либо определять двумерный массив по максимуму, либо трансформировать свой двумерный массив в одномерный. Т.е. заводишь массив не так: A : array [1..N, 1..M] of Byte;
а так: B : array [1..N*M] of Byte;
Тогда элемент первого массива A [i, j] будет соответствовать, например, элементу B [(j-1) * N + i] и наоборот. Слово "например" в предыдущем предложении употреблено потому, что такое отображение двумерного массива на одномерный не единственное. Можно транспонировать не по строкам, а по столбцам, тогда индекс в одномерном массиве будет такой: (i-1) * M + j.
Ответ отправлен: 12.03.2004, 12:54 Отправитель: Ayl Отвечает samum2000
Приветствую вас, Павел. О границах какого массива идет речь? Вы хотите читать в массив байт содержимое файла, так? У вас, на мой взгляд, остается только один вариант - работать с динамической памятью. То есть вы сначала резервируете за указателем необходимый объем памяти, считываете туда файл, а в процедуру передаете сам указатель. Нужно, конечно, сказать еще о т.н. "открытом массиве" - формальном параметре подпрограммы, который описывает базовый тип элементов, но не описывает размерность массива: Procedure (MyArray: array of byte); Верхнюю границу MyArray вернет функция High, а нижняя равна 0. Однако этот метод, судя по задаче, на подходит.
Приложение: Ответ отправлен: 12.03.2004, 14:09 Отправитель: samum2000 Отвечает Boriss
Здравствуйте, Pavel! Для двумерного массива такого в Borland Pascal нет. Нужно как-то обходить по-другому. Наверно, лучше всего рассчитать, сколько памяти нужно. Получить ее в динамической памяти с помощью GetMem Загрузить туда содержимое картинки с помощью BlockRead Для чтения ряда или точнее переноса его в видеопамять вомпользоваться Move Если длина ряда известна, но вычислить адрес N-го ряда несложно Процедуре передать указатель на этот "двумерный" массив, длину ряда и количество рядов Если не справишься, то пиши bsurin@mail.ru Ответ отправлен: 12.03.2004, 20:06 Отправитель: Boriss Отвечает ILuHER®
Добрый день, Pavel! Этот вопрос очень часто задается, я уже отвечал на этот вопрос, посмотри архив рассылки я там и примерчик наваял Ответ отправлен: 13.03.2004, 14:18 Отправитель: ILuHER®
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.