Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизПравильно сложить 2 дин. массива Найти похожие ветки
← →
Kolan © (2006-10-15 14:17) [0]Здравствуйте,
Что-то смотрю на процедуру сложения и понима, что можно проще и быстрее: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;
А как?
← →
Проггер из библиотеки (2006-10-15 14:21) [1]Вот не помню. Там нельзя случайно просто A+B?
← →
Loginov Dmitry © (2006-10-15 14:24) [2]Возможно, что с импользованием Move это могло бы быть быстрее. Но врядли намного. (Хотя я не в курсе, как Move работает с открытыми массивами).
← →
Kolan © (2006-10-15 14:24) [3]
> A+B
Нет.
← →
Desdechado © (2006-10-15 14:58) [4]какой смысл работать с массивами байтов, если можно выделить кусок памяти нужной длины?
PS
FullIndex := FullIndex + 1; => Inc( FullIndex );
← →
Anatoly Podgoretsky © (2006-10-15 15:13) [5]Один раз SetLength и два раза Move
Только почему ты это называешь сложением?
← →
Kolan © (2006-10-15 18:51) [6]
> Только почему ты это называешь сложением?
Да не точно..
> 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-й - тут не пойму как сделать...
← →
Массив (2006-10-15 23:36) [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 23:42) [8]
> Массив (15.10.06 23:36) [7]
Угу понял :)
← →
evvcom © (2006-10-16 08:40) [9]> [7] Массив (15.10.06 23:36)
> Move(Arr1[1],
> Move(Arr2[1],
почему с 1? array of Byte индексируется с 0.
← →
Массив (2006-10-16 11:11) [10]Хм. Делов-то. Главное в [7].
Ну и лучше тогда так:SetLength(Answer,Length(Arr1) + Length(Arr2));
Move(Arr1[Low(Arr1)], Answer[0], SizeOf(Arr1));
Move(Arr2[Low(Arr1)], Answer[SizeOf(Arr1)], SizeOf(Arr2));
← →
Массив (2006-10-16 11:16) [11]Чёрт возми, копи-пасте подводит:)
Конечно неMove(Arr2[Low(Arr1)],
, аMove(Arr2[Low(Arr2)],
← →
han_malign © (2006-10-16 11:57) [12]
SizeOf(Arr1) ==> (Length(Arr1)*SizeOf(Arr1[Low(Arr1)]))
З.Ы. А "слияние массивов(строк)" называется - конкатенация...
← →
Kolan © (2006-10-17 15:07) [13]С учетом объяснения MBo
http://delphimaster.net/view/2-1161081499/
Сделал так: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)]));
Правильно?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.062 c