Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1237201177
Pavel
2009-03-16 13:59
2009.04.26
Работа с WordDocument


15-1235487223
БарЛог
2009-02-24 17:53
2009.04.26
Любителям шахмат =)


2-1237296025
LLL
2009-03-17 16:20
2009.04.26
TListView. Показать нужную строку.


2-1236602322
DL
2009-03-09 15:38
2009.04.26
Логические выражения


2-1236634530
Дмитрий Белькевич
2009-03-10 00:35
2009.04.26
Как правильнее закрывать приложение? App.Terminate или Close





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский