Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Указатели и работа с вирт. памятью   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
15-1235768854
Kostafey
2009-02-28 00:07
2009.04.26
Решил посмотреть программы для сравнения файлов


2-1237272243
Тетрис2009
2009-03-17 09:44
2009.04.26
поиск файлов


2-1237315821
Alral
2009-03-17 21:50
2009.04.26
очищение памяти, занимаемой переменной String


15-1234684978
Marser
2009-02-15 11:02
2009.04.26
КПК Asus MyPal A696


15-1235553818
DVM
2009-02-25 12:23
2009.04.26
Работа программиста - это сон?!