![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели и работа с вирт. памятью [D7]
Franzy © (2009-03-09 12:41:00)Задача: записать в память, выделенную с помощью CreateFileMapping несколько разнородных данных. Например, 10 чисел типа Double (DataType1=8) и пять чисел типа Longint (DataType2=4).
С помощью CreateFileMapping создаю в вирт. памяти образ:
MapHandle := CreateFileMapping(
$FFFFFFFF, // handle to page memory
nil, // optional security attributes
PAGE_READWRITE, // protection for mapping object
0, // high-order 32 bits of object size
10*8*Sizeof(DataType1)+5*8*Sizeof(DataType2) , // low-order 32 bits of object size
"MemoryFile1" // name of file-mapping object
);
Открываю его для записи:
Address:= MapViewOfFile(
MapHandle, // file-mapping object to map into address space
FILE_MAP_WRITE , // access mode
0, // high-order 32 bits of file offset
0, // low-order 32 bits of file offset
0 // number of bytes to map
);
Address - это Pointer, который вроде бы указывает на начало моего виртуального файла. Как теперь записать мои данные в этот файл? Я не совсем понимаю механику работы указателей на память. Вот есть команда move, которая копирует байты из одного источника в другой.
Предположим, я копирую первое число в память:
move(x^[1],Address^,Sizeof(x[1]));
Как теперь "передвинуть каретку"? Так что ли: Inc(Address,Sizeof(x[1]))?
Palladin (2009-03-09 15:25:00) [1]
> это просто порядковый номер элемента памяти?
Только не элемента. А, условно говоря, порядковый номер байта в виртуальном, а не локальном пространстве, с которого начинаются данные этого элемента.
Franzy (2009-03-09 14:41:00) [2]Спасибо, разобрался вроде бы.
Palladin (2009-03-09 14:27:00) [3]
> То есть, получается, адресация пространства памяти - локальная?
Ага.
> Получается, адрес - это просто порядковый номер элемента
> памяти?
Ну можно сказать и так.
> Если у нас указатель - байт, то и номер будет номером байта.
> Если у нас указатель на дабл, то указатель будет на номер
> "восьмерок" байтов, так что ли?
Ага. Inc + F1
Franzy (2009-03-09 14:22:00) [4]Я просто не сразу до этого допер :) Сначала у меня тип Pointer был, но для него inc нельзя использовать. А ваш метод тоже прекрасно работает :)
То есть, получается, адресация пространства памяти - локальная? Получается, адрес - это просто порядковый номер элемента памяти? Если у нас указатель - байт, то и номер будет номером байта. Если у нас указатель на дабл, то указатель будет на номер "восьмерок" байтов, так что ли?
Palladin (2009-03-09 13:25:00) [5]а сразу указать что Address у тебя ^byte, не судьба была? в этом случае inc вполне приемлим
Franzy (2009-03-09 13:18:00) [6]Сделал так:
Address: ^byte;
x: array [1..10] of longint;
y: array [1..5] of double;
////////////
Address:= MapViewOfFile(
MapHandle, // file-mapping object to map into address space
FILE_MAP_WRITE , // access mode
0, // high-order 32 bits of file offset
0, // low-order 32 bits of file offset
0 // number of bytes to map
);
for i:=1 to 10 do x[i]:=i*i;
for i:=1 to 5 do y[i]:=1/i;
for i:=1 to 10 do
begin
move(x[i],address^,Sizeof(x[i]));
inc(address,sizeof(x[i]));
end;
for i:=1 to 5 do
begin
move(y[i],address^,Sizeof(y[i]));
inc(address,sizeof(y[i]));
end;
Вроде работает, пишет что нужно, и считать потом можно. Сейчас попробую ваш метод, чтобы определить адрес элемента при считывании, чтобы inc не юзать, а сразу адрес получить.
Palladin (2009-03-09 12:53:00) [7]фих его знает что у тебя за x[1]
Address:=Pointer(Integer(Address)+количество байт)