Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как откопировать 2-мерный динамический массив?


Автор: Kursist 8.11.2004, 18:24
Имеется статический 2-мерный массив, [1000х800] надо в него скопировать содержимое нескольких 2х-мерных динамических массивов с с неопределенной но более малой размерностью (например: [100х200], копироваться должно в область статического массива, начиная с произвольного элемента (напр.: [50,100]) - не с первого, Знаю для одномерных, надо использовать циклы и операторы High(VirtArray), low(VirtArray), или Copy(array,n),  а как с 2х-мерными динамическими массивами - не знаю! Подскажите, кто знает. Спасибо!

Автор: Zero 8.11.2004, 19:22
Забей ты на все эти операторы, и делай так как будто у тебя статический массив, но не забывай что он начинается от нуля.
Для примера можеш посмотреть тут:
Код

var
 Form1: TForm1;
 a:array[1..20,1..10] of integer;
 d:array of array of integer;
 i,j:integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 randomize;
 setlength(d,5);
 for i:=0 to 4 do
   setlength(d[i],4);
 for i:=0 to 4 do
   for j:=0 to 3 do
     d[i,j]:=random(9);  // Запись динамического массива
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 for i:=2 to 6 do
   for j:=3 to 6 do
     a[i,j]:=d[i-2,j-3];  //Перезапись из динамического массива в статический
end;

Только размерность я взял поменьше, чтобы тбе понятнее было, да и копирование происходит из одного массива а не из двух, но ты можеш сделать как захочеш... smile

Автор: Kursist 9.11.2004, 10:04
Супер!!! Спасибо огромное!

Автор: Kursist 10.11.2004, 10:45
Идея реализации будет следующая: создается 2-x мерный статический массив (размером Client.Width * Client.Hight) целых чисел. Далее, будут создаваться 2-x мерные динамические массивы (размером ObjectBitmap.Width * ObjectBitmap.Hight) булевых переменных. В него заносятся значения FALSE, если пиксел на битмапе непрозрачный и TRUE - если прозрачный. Далее идет вывод изображения ObjectBitmap с учетом прозрачности на TempBitmap в позицию X,Y; а в статический массив заносятся ID "Объекта" (представленного ObjectBitmap). Далее TempBitmap выводится на Canvas формы. В процедуре обработки OnMouseClick берутся координаты 'клика' X,Y и проверяется значения элемента статического массива [X,Y] - В нем ID - следовательно такой объект выделен, значит нужный ObjectBitmap необходимо заменить.

Автор: p0s0l 10.11.2004, 13:08
Kursist видимо писал ответ в тему:
http://forum.vingrad.ru/index.php?showtopic=32476

Автор: Kursist 10.11.2004, 13:24
p0s0l
Нет, не писал, но за линк спасибо!

Автор: p0s0l 10.11.2004, 14:24
Опс! smile Я что-то не посмотрел, что ты и есть автор темы smile
Я посмотрел - какие-то битмапы, маусклики - думаю, причём здесь это ? smile
Извини smile мой пост совсем не в тему получился...

У тебя с этим трудности ?:
Цитата(Kursist)
Идея реализации будет следующая:


Автор: Kursist 10.11.2004, 17:08
Цитата(p0s0l @ 10.11.2004, 14:24)

У тебя с этим трудности ?:
Цитата(Kursist)
Идея реализации будет следующая:

Цитата(p0s0l)
Идея реализации будет следующая:


Нет, спасибо, уже все нормально. Просто меня в какой-то момент заклинило smile
Создаю простенький 2D квест (рисую много графики) - пишу свой '2D Engine' без использования OpenGL или DelphiX. Скорость вывода меня вполне устроила (использую GetTicCount() и InvalidateRect(). Хоть мне и нравится OpenGL, но его я еще недостаточно изучил (да и примеры из книги Красного по OpenGL касающиеся прозрачности материалов у меня почему-то работают без прозрачности), а создать квест не терпиться smile

Автор: Marriage 12.11.2004, 17:39
Цитата

в него скопировать содержимое нескольких 2х-мерных динамических массивов



Вопрос в тему..
ЕСть 2 переменные ...
a,b: array of integer;
после выполнение SetLength(a,100), а SetLength(b,100) и
a[1]:=3;
b[1]:=1000;
то в a[1] будет значение 1000, это прикол такой или как ????
И можно ли этого как нить избежать ???

Автор: p0s0l 12.11.2004, 18:11
Скорее всего, где-то после SetLength'ов у тебя строка типа:
a := b; или b := a;...

Автор: Marriage 12.11.2004, 19:49

Цитата
Скорее всего, где-то после SetLength'ов у тебя строка типа:
a := b; или b := a;...


В том то и дело ,то нет ...

Строки подряд идут ...


a[1]:=3;
b[1]:=1000;

ShowMessage (IntToStr(a[1]));

Показывает 1000


Автор: p0s0l 12.11.2004, 21:02
Ну не может такого быть...
Либо b объявлен как absolute a (или наоборот), либо идёт типа такого:
Код
a := b; // или b := a;
a[1] := 3;
b[1] := 1000;

Либо где-то у тебя ошибка работы с памятью в программе, которая в последствии выливается в такое... Или ты что-то недоглядел...

Вышли, plz, мне исходник.

Автор: Zero 12.11.2004, 22:49
Marriage, я не знаю чё ты там намудрил, но попробуй, запустить Delphi с нуля, потом в раздел Var, запехни
Код

 a,b:array of integer;

А потом на кнопку (например: Tbutton) воткни это
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 SetLength(a,100);
 SetLength(b,100);
 a[1]:=3;
 b[1]:=1000;
 ShowMessage(inttostr(a[1]));
end;

Если это у выведется не 3, то можеш викинуть свой комп, проблема в нём... smile

Замечание:Мне бы тоже хотелось, глянуть на твой исходник... smile

Автор: Marriage 13.11.2004, 11:18
Комп выкидывать не собираюсь.
Проблема не внем, а скорее всего в настройках, т.к. на Билдере все нормально.
Такое осчучение, что 1 массив накладывается на другой ...
Может в настройках где-нить полазить???
Или купить лицензионную Дельфю ??? smile

Исходник приведен выше ....

Единственная может быть разница в том, что a,b:array of integer;
это модуль одной проги, в которой модулей 20, и то почти все не мои ...
А разбираться в чужих исходниках - это ж не есть гут .... Тем более БД ...

Автор: Zero 13.11.2004, 11:44
Если ты написал так как я тебе выслал исходник, и у тебя всё равно не работает, то наверное у тебя "внатуре", Delphi глючит, я тогда могу посоветовать лишь, переустановить delphi...
Хотя может тебе Посол чё-нибудь, подскажет...
Цитата
Или купить лицензионную Дельфю ???

У меня она тоже не лицензионная, и работает... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)