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

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

Как изменть значение указателя?


Страницы:   1 2 3

Дурдом ©   (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.


Страницы:   1 2 3

Наверх

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