Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильно сложить 2 дин. массива


Kolan ©   (2006-10-15 14:17:00) 

Здравствуйте,
 Что-то смотрю на процедуру сложения и понима, что можно проще и быстрее:
procedure TCustomPackageBuilder.AddArrays(Arr1, Arr2: array of Byte;
 var Answer: TByteArray);
var
 I, FullIndex: Longint;
begin
 SetLength(Answer, Length(Arr1) + Length(Arr2));
 FullIndex := Low(Answer);
 for I := Low(Arr1) to High(Arr1) do
 begin
   Answer[FullIndex] := Arr1[I];
   FullIndex := FullIndex + 1;
 end;
 for I := Low(Arr2) to High(Arr2) do
 begin
   Answer[FullIndex] := Arr2[I];
   FullIndex := FullIndex + 1;
 end;
end;


А как?


Kolan   (2006-10-17 15:07:00) [1]

С учетом объяснения MBo

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1161081499&n=18

Сделал так:

 SetLength(Answer, Length(Arr1) + Length(Arr2));
 Move(Arr1[Low(Arr1)], Answer[Low(Answer)],
   Length(Arr1)*SizeOf(Arr1[Low(Arr1)]));
 Move(Arr2[Low(Arr2)], Answer[Length(Arr1)*SizeOf(Arr1[Low(Arr1)])],
   Length(Arr2)*SizeOf(Arr2[Low(Arr2)]));


Правильно?


han_malign   (2006-10-16 11:57:00) [2]

SizeOf(Arr1) ==> ( Length(Arr1)*SizeOf(Arr1[Low(Arr1)]))

З.Ы. А "слияние массивов(строк)" называется - конкатенация...


Массив   (2006-10-16 11:16:00) [3]

Чёрт возми, копи-пасте подводит:)
Конечно не Move(Arr2[Low(Arr1)], , а
Move(Arr2[Low(Arr2)],


Массив   (2006-10-16 11:11:00) [4]

Хм. Делов-то. Главное в [7].
Ну и лучше тогда так:
 SetLength(Answer,Length(Arr1) + Length(Arr2));
 Move(Arr1[Low(Arr1)], Answer[0], SizeOf(Arr1));
 Move(Arr2[Low(Arr1)], Answer[SizeOf(Arr1)], SizeOf(Arr2));


evvcom   (2006-10-16 08:40:00) [5]

> [7] Массив   (15.10.06 23:36)
> Move(Arr1[1],
> Move(Arr2[1],

почему с 1? array of Byte индексируется с 0.


Kolan   (2006-10-15 23:42:00) [6]


> Массив   (15.10.06 23:36) [7]

Угу понял :)


Массив   (2006-10-15 23:36:00) [7]

SetLength(Answer,Length(Arr1) + Length(Arr2));
 Move(Arr1[1], Answer[0], SizeOf(Arr1));
 Move(Arr2[1], Answer[SizeOf(Arr1)], SizeOf(Arr2));


Kolan   (2006-10-15 18:51:00) [8]


> Только почему ты это называешь сложением?

Да не точно..


> Move

А как им пользоваться? Непонимаю. Пример в справке D7 есть, вроде понятный:
var

 A: array[1..4] of Char;
 B: Integer;
begin
 Move(A, B, SizeOf(B));  { SizeOf = safety! }
end;


Тут перый элемент копируется в B.

А для моего случая?
Один раз SetLengthтут понятно выделяем массив длинны A+B.
1-й Move Копируем первый массив в результирующй
2-й - тут не пойму как сделать...


Anatoly Podgoretsky   (2006-10-15 15:13:00) [9]

Один раз SetLength и два раза Move
Только почему ты это называешь сложением?


Desdechado   (2006-10-15 14:58:00) [10]

какой смысл работать с массивами байтов, если можно выделить кусок памяти нужной длины?

PS
FullIndex := FullIndex + 1;   => Inc( FullIndex );


Loginov Dmitry   (2006-10-15 14:24:00) [11]

Возможно, что с импользованием Move это могло бы быть быстрее. Но врядли намного. (Хотя я не в курсе, как Move работает с открытыми массивами).


Kolan   (2006-10-15 14:24:00) [12]


> A+B

Нет.


Проггер из библиотеки   (2006-10-15 14:21:00) [13]

Вот не помню. Там нельзя случайно просто A+B?


Наверх

Титульная страница Поиск, карта сайта Написать письмо