![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно сложить 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?