Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Правильно сложить 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.057 c
2-1161511329
Riply
2006-10-22 14:02
2006.11.05
EnumResourceTypes типы перебирает, но возвращает ошибку


6-1150209045
Leshik
2006-06-13 18:30
2006.11.05
TIdIRC


11-1137864238
Boguslaw
2006-01-21 20:23
2006.11.05
KOL Unicode


15-1160644299
Desdechado
2006-10-12 13:11
2006.11.05
Пара вопросов по VS 2005


2-1161624363
Busik
2006-10-23 21:26
2006.11.05
ini-файл в теле exe