Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в run-time задать границы массива, (двухмерного) 
:(
    Опции темы
dm9
Дата 29.10.2003, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Возникла такая задача.
Приложение и dll работают с разделяемой памятью. Фактически разделяемая память является двухмерным массивом.
Но понятно, что разделяемая память - это всего лишь последовательность байт. Для того, чтобы мне было удобно работать с этой памятью, требуется сослаться на неё удобной мне структурой.
Например, если я заранее знаю размер матрицы, то это делается так:

Код
type
  TAr = array [0..1024, 0..1024] of Byte;
  PAr = ^TAr;
var
  PicAr : PAr;
begin
  ...
  PicAr := MapViewOfFile (Hnd, FILE_MAP_WRITE, 0, 0, 0);
  ...
end;


Но в моей задаче размер заранее неизвестен.

Можно, конечно, работать с линейной структурой:

Код
type
  TLine = array [0..$7FFFFFFE] of Byte;
  PLine = ^TLine;
var
  PicAr      : PLine;
begin
  ...
  PicAr := MapViewOfFile (Hnd, FILE_MAP_WRITE, 0, 0, 0);
  ...
end;


Но это крайне неудобно.

Как мне описать такую структуру, чтобы можно было работать с блоком разделяемой памяти как с двухмерным массивом, размеры оторого заранее неизвестны (они передаются в процедуру как параметры)?
PM MAIL ICQ   Вверх
cot
Дата 29.10.2003, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 4.6.2003

Репутация: нет
Всего: нет



Задай двухмерный динамический TLine=Array of array of byte
PM MAIL   Вверх
Paradox
Дата 29.10.2003, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Код
var

 A : array of array of byte;
 I, J : Integer;
begin
 SetLength(A, 10);
 for I := Low(A) to High(A) do
 begin
   SetLength(A[I], I);
   for J := Low(A[I]) to High(A[I]) do
     A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
 end;
end;
например так... а вообще почитай по этому поводу топик dynamic arrays в справке по Delphi


--------------------
---
PM MAIL WWW   Вверх
p0s0l
Дата 29.10.2003, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Можно попробовать что-то вроде такого:
Код
type
 TLine = array [0..$7FFFFFFE] of Byte;
 PLine = ^TLine;
var
 PicAr      : PLine;
 DynArray : array of PLine;
 
procedure SetDimensions (d1, d2 : integer);
var
 i : integer;
begin
 SetLength (DynArray, d1);
 for i := 0 to d1-1 do DynArray[i] := PLine(cardinal(PicAr) + i*d2);
end;

begin
 ...
 PicAr := MapViewOfFile (Hnd, FILE_MAP_WRITE, 0, 0, 0);
 SetDimensions (1024, 2048); // задать размеры: 1024 строк, 2048 столбцов
 ...
// пример обращения к маccиву
 for y := 0 to 1023 do
  for x := 0 to 2047 do
    DynArray[y][x] := x+y;
// или
    DynArray[y, x] := x + y;
 ...
end;


SetDimensions задаёт размеры матрицы DynArray
Обращаться к матрице - как обычно: DynArray[y, x] := ...


--------------------
С уважением, г-н Посол.
PM   Вверх
dm9
Дата 29.10.2003, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



p0s0l, большое спасибо за идею. Попробую сделать так.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.