Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
ВнизУказатели и работа с вирт. памятью Найти похожие ветки
← →
Franzy (2009-03-09 12:41) [0]Задача: записать в память, выделенную с помощью 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 12:53) [1]фих его знает что у тебя за x[1]
Address:=Pointer(Integer(Address)+количество байт)
← →
Franzy (2009-03-09 13:18) [2]Сделал так:
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 13:25) [3]а сразу указать что Address у тебя ^byte, не судьба была? в этом случае inc вполне приемлим
← →
Franzy (2009-03-09 14:22) [4]Я просто не сразу до этого допер :) Сначала у меня тип Pointer был, но для него inc нельзя использовать. А ваш метод тоже прекрасно работает :)
То есть, получается, адресация пространства памяти - локальная? Получается, адрес - это просто порядковый номер элемента памяти? Если у нас указатель - байт, то и номер будет номером байта. Если у нас указатель на дабл, то указатель будет на номер "восьмерок" байтов, так что ли?
← →
Palladin © (2009-03-09 14:27) [5]
> То есть, получается, адресация пространства памяти - локальная?
Ага.
> Получается, адрес - это просто порядковый номер элемента
> памяти?
Ну можно сказать и так.
> Если у нас указатель - байт, то и номер будет номером байта.
> Если у нас указатель на дабл, то указатель будет на номер
> "восьмерок" байтов, так что ли?
Ага. Inc + F1
← →
Franzy (2009-03-09 14:41) [6]Спасибо, разобрался вроде бы.
← →
Palladin © (2009-03-09 15:25) [7]
> это просто порядковый номер элемента памяти?
Только не элемента. А, условно говоря, порядковый номер байта в виртуальном, а не локальном пространстве, с которого начинаются данные этого элемента.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c