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

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

Все просто [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(...) ?


Наверх

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