![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Все просто [D6]
Fast © (2002-07-31 15:15:00)Как скопировать N элементов из одного массива в другой не используя цикл? (борюсь за скорость)
Fast (2002-07-31 16:24:00) [1]>Leran2002 © (31.07.02 16:10)
да отлично то что надо
Leran2002 (2002-07-31 16:10:00) [2]Ну че все нормально... Подошло???
Fast (2002-07-31 16:08:00) [3]понял
thx
Leran2002 (2002-07-31 16:07:00) [4]Адрес пишется вообщето с одной "С"... ;-))
Alx2 (2002-07-31 16:06:00) [5]1 integer=4 byte
отсюда и считается.
Но сначала надо скорострельность по сравнению с move проверить.
Leran2002 (2002-07-31 16:05:00) [6]Держи:
procedure TForm1.Button4Click(Sender: TObject);
const
n=1000;
m=10;
type
MyType=byte;
var
a,b:array[1..n]of MyType;
i:integer;
begin
for i:=1 to n do a[i]:=random(256); // забивка массива "a"
ZeroMemory(@b,SizeOf(MyType)*n); // зануляем массив "b"
CopyMemory(@b[m],@a[m],SizeOf(MyType)*(n-m+1)); // из "a" в "b"
for i:=1 to n do // проверка
Memo1.Lines.Add(IntToStr(a[i])+"="+IntToStr(b[i]));
end;
Fast (2002-07-31 16:05:00) [7]>Leran2002 © (31.07.02 15:53)
а на случай если надо вставить N элементов не с начала, а скажем с M позиции. как сместить адресс?
Fast (2002-07-31 15:58:00) [8]а на случай если надо вставить N элементов не с начала, а скажем с M позиции. как сместить адресс?
Leran2002 (2002-07-31 15:53:00) [9]Модифицировал проверку и забивку:
procedure TForm1.Button4Click(Sender: TObject);
const
n=1000;
var
a,b:array[1..n]of byte;
i:integer;
begin
for i:=1 to n do a[i]:=random(256); // забивка массива "a"
CopyMemory(@b,@a,SizeOf(a)); // из "a" в "b"
for i:=1 to n do // проверка
Memo1.Lines.Add(IntToStr(a[i])+"="+IntToStr(b[i]));
end;
Alx2 (2002-07-31 15:53:00) [10]>Fast (31.07.02 15:35)
Тогда, наверное, будет интересно сравнить move с поэлементным копированием массива типа integer.
procedure TForm1.Button1Click(Sender: TObject);
Type TBytesArray = packed array [1..1024] of byte;
TIntsArray = packed array [1..256] of integer;
Var
A,B : TBytesArray;
k : integer;
begin
for k := 1 to 1024 do A[k] := k; // Заполняем массив значениями k mod 256
for k := 1 to 256 do // копируем содержимое A в B
TIntsArray(B)[k]:=TIntsArray(A)[k];
end;
Leran2002 (2002-07-31 15:47:00) [11]Держи может подойдет:
procedure TForm1.Button4Click(Sender: TObject);
var
a,b:array[1..100]of byte;
i:integer;
begin
for i:=1 to 100 do a[i]:=i; // забивка массива "a"
CopyMemory(@b,@a,SizeOf(a)); // из "a" в "b"
for i:=1 to 100 do // проверка
Memo1.Lines.Add(IntToStr(b[i]));
end;
Fast (2002-07-31 15:35:00) [12]размер элементов в 1 байт
Alx2 (2002-07-31 15:23:00) [13]Move тоже не всегда панацея. Бывает, в цикле быстрее получается.
Кстати, размер элементов массива какой? Если-что, можно задействовать 64-битную арифметику.
Fast (2002-07-31 15:19:00) [14]спа.
Skier (2002-07-31 15:16:00) [15]>Fast
Move(...) ?