![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как изменть значение указателя?
Дурдом © (2005-01-03 02:40:00)Доброй ночи!
Можно ли средствами Делфи не прибегая к инлайн-ассемблеру сделать следующее:
var
A1:array[0..$FF] of byte;
FileMapped:pointer; //указатель на кусок памяти
n:integer;
---
begin
for i:=0 to $FF do
A1[i]:=значение байта (по адресу (указателя на кусок памяти+i))
Это означает, что FileMapped указывает на некий массив байт, и надо заполнить массив A1 байтами, на которые указывает FileMapped (пододвигая значение указателя на 1 в право, но если можно по-другому - я не против).
Fay (2005-01-03 20:29:00) [21]Pointer(DWORD(FileMapped)+i) ?
begin...end (2005-01-03 20:28:00) [22]> [20] Дурдом (03.01.05 20:19)
О боже, а что Вы хотели сделать-то?
Дурдом (2005-01-03 20:19:00) [23]Дык об одном и том-же говорим ;) move() буит рулить при крупненьких массивах.
---
А такой вариант как сделать(компилер материт):
type
AT: array[0..$0F] of byte;
var
FileMapped:pointer;
A1: AT;
i:integer;
begin
for i:=0 to $0F do
A1:=AT((FileMapped+i)^);
????
Fay (2005-01-03 20:03:00) [24]2 АвторДурдом (03.01.05 19:46) [17]
А мне пофинг - я время считал.
(2005-01-03 19:52:00) [25]Удалено модератором
(2005-01-03 19:46:00) [26]Удалено модератором
Fay (2005-01-03 19:26:00) [27]2 GuAV © (03.01.05 19:11) [15]
Я это уже сделал. На миллионе итераций, чтобы было видно разницу тупо по времени. Move быстрее, при 999 (взял с потолка) ещё заметнее.
GuAV (2005-01-03 19:11:00) [28]Fay © (03.01.05 18:56) [14]
Всё равно присвоение немного быстрее.
хинт:
type
TA1 = array [0..320] of Byte;
var
A1: TA1;
FileMapped: Pointer;
begin
A1 := TA1(FileMapped^); // поставьте тут BreakPoint и посмотрите на CPU. А потом посмотрите на Move.
end;
Fay (2005-01-03 18:56:00) [29]2 GuAV © (03.01.05 18:33) [13]
В данном случае ([0..$FF]) Move медленнее. Но сравните при[0..320], к примеру.
GuAV (2005-01-03 18:33:00) [30]Автор (03.01.05 18:22) [12]
А move будет быстрее при больших массивах.
Не-а.
(2005-01-03 18:22:00) [31]Удалено модератором
GuAV (2005-01-03 18:04:00) [32]Самым быстрым же однако в общем случае будет присвоение массива целиком.
type
TA1 = array [0..$FF] of Byte;
var
A1: TA1;
FileMapped: Pointer;
I: Integer;
begin
A1 := TA1(FileMapped^);
end;
Fay (2005-01-03 17:53:00) [33]2 TUser © (03.01.05 13:32) [7]
Move побыстрее будет.
Дурдом (2005-01-03 13:57:00) [34]Ух! круто! Оба способа подошли: и move, и PByteArray. В случае с PByteArray всё стало происходить так, как я и задумывал(циклом), а в случае с move, всё сошлось на долгой процедуре со строковыми командами "repCC movsX" - но так я уже сам сделал на Асме. С циклом поэксперементировать интересно (вдруг быстрее будет :).
---
Шпасибо =)
begin...end (2005-01-03 13:36:00) [35]> [7] TUser © (03.01.05 13:32)
> зачем сначала копировать/перемещать кусок памяти, а потом
> читать
См. [0]:
> FileMapped указывает на некий массив байт, и надо заполнить
> массив A1 байтами, на которые указывает FileMapped
TUser (2005-01-03 13:32:00) [36]Просто непонятно - зачем сначала копировать/перемещать кусок памяти, а потом читать, если можно сразу прочитать через приведение к массиву или с индексной арифметикой ...
begin...end (2005-01-03 12:47:00) [37]> [5] TUser © (03.01.05 12:45)
А за что оно тебе так не нравится?
TUser (2005-01-03 12:45:00) [38]А за что всем так нравится Move для этой задачи?
begin...end (2005-01-03 10:08:00) [39]Извиняюсь, просмотрел - это уже предложили в [1].
begin...end (2005-01-03 09:58:00) [40]> Дурдом (03.01.05 02:40)
Приведу ещё один вариант, хотя я бы тоже воспользовался Move или CopyMemory.
var
A1: array [0..$FF] of Byte;
FileMapped: Pointer;
I: Integer;
begin
for I := 0 to $FF do
A1[I] := PByteArray(FileMapped)[I]
end.