Как передать массив в разделяемую память в Windows c / c

#c

#c

Вопрос:

Если pMapMen имеет длину 7 элементов, как мне передавать более одного элемента за раз. Приведенный ниже код передает один элемент.

 //Create memory mapped file - pMapMem
 pMapMem[1] = (int*)MapViewOfFile( 
                       hMap,                   // Handle to map object
                       FILE_MAP_ALL_ACCESS,    // Read/Write permisssion
                       0, 
                       0, 
                       BYTES_TO_MAP);
 

Комментарии:

1. Вы пытаетесь создать несколько отображенных представлений? Распространенным методом является использование одной структуры (которая может содержать другие структуры, массивы, элементы, …) для всей отображенной памяти, для чего потребуется только один базовый указатель для каждого процесса.

Ответ №1:

Предполагая, что ваш файл содержит только массив NUM_ELEM элементов, а их тип — myelement_t struct , вы могли бы сделать что-то вроде этого:

 #define BYTES_TO_MAP (NUM_ELEM * sizeof(myelement_t))

myelement_t *elem;
void *mmapped = MapViewOfFile( 
                       hMap,                   // Handle to map object
                       FILE_MAP_ALL_ACCESS,    // Read/Write permisssion
                       0, 
                       0, 
                       BYTES_TO_MAP);

if(NULL != mmapped) {
  elem = (myelement_t *) mmapped;
  for(i= 0; i < NUM_ELEM; i  ) {
    printelem(elem[i]);
  }
}
 

Если ваш код передает только 1 элемент, то это, вероятно, потому, что вы сопоставили только 1 элемент, т.Е. BYTES_TO_MAP Равен длине 1 элемента

Комментарии:

1. В моем массиве есть только целые числа, я определяю его как int *pMapMem[7];

2. int *pMapMem[7]; не объявляет массив целых чисел. Это массив из 7 указателей (на целые числа).

3. Да, я немного растерялся. Является ли ваш пример c ?

4. @Gozmit — примером является код на языке Си. В вашем случае измените myelement_t на int. printelem() может быть любой созданной вами функцией, или вы можете просто использовать printf .