File Mapping. Как правильно делать присваивание [закрыт]

131
18 сентября 2019, 01:20

Никак не пойму - в чем ошибка?

Код:

const char MFName_r[] = "1223_r";     // Название файла для File Mapping для чтения
const char MFName_w[] = "1223_w";     // Название файла для File Mapping для чтения
// Структуры
struct FMP_struct{
    HANDLE readfile;
    HANDLE writefile;
    int* read;
    int* write;
} FMP;
/////////////////////////////////////////////////////////////////////
// //
// Работа с File Mapping
// //
/////////////////////////////////////////////////////////////////////
// Создание Map файла
void LetMeMapFlie(){
    // Создаем файлы
    FMP.writefile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 255, MFName_w);
    FMP.readfile  = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READONLY,  0, 255, MFName_r);
    // Открываем файлы
    FMP.write = (int*)MapViewOfFile(FMP.writefile, FILE_MAP_WRITE, 0,0,0);
    FMP.read  = (int*)MapViewOfFile(FMP.readfile,  FILE_MAP_READ, 0,0,0);
}
// Считать CHAR из MAP
unsigned char ReadChar_SlimRG(){
    return (char)FMP.read[0];
}
// Считать INT из MAP
int ReadInt_SlimRG(){
    return (int)FMP.read[0];
}
// Записать INT в MAP
void WriteInt_SlimRG(int key){
  FMP.writefile[0] = (int)key;
}
// Записать CHAR в MAP
void WriteChar_SlimRG(unsigned char key){
  FMP.writefile[0]) = (int)key;
}

Пишет - subscript of pointer to incomplete type 'void'

И выделяет:

void WriteInt_SlimRG(int key){
  FMP.writefile[0] = key;
}

и

void WriteChar_SlimRG(unsigned char key){
  FMP.writefile[0]) = (int)key;
}
Answer 1

Потому что обращение к памяти должно идти по адресу FMP.write, а не к хэндлу FMP.writefile

Answer 2

Попробуйте делать так, и обратите внимание на явное приведения типов:

#include <Windows.h>
#include <iostream>
typedef struct memory_mapped_file
{
    explicit memory_mapped_file(const size_t file_size) :
        read_handle(nullptr),
        write_handle(nullptr),
        read_ptr(nullptr),
        write_ptr(nullptr)
    {
        write_handle = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, file_size, L"mm_file_rw");
        read_handle = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READONLY, 0, file_size, L"mm_file_ro");
        read_ptr = MapViewOfFile(read_handle, FILE_MAP_READ, 0, 0, file_size);
        write_ptr = MapViewOfFile(write_handle, FILE_MAP_WRITE, 0, 0, file_size);
        // Необходимо доработать обработку невалидных хэндлов
    }
    ~memory_mapped_file()
    {
        if (read_handle != INVALID_HANDLE_VALUE && read_handle != nullptr)
        {
            UnmapViewOfFile(read_handle);
            CloseHandle(read_handle);
        }
        if (write_handle != INVALID_HANDLE_VALUE && write_handle != nullptr)
        {
            UnmapViewOfFile(write_handle);
            CloseHandle(write_handle);
            write_handle = nullptr;
        }
    }
    template <typename T>
    void write(const T data, const size_t offset = 0)
    {
        T* writable = static_cast<T*>(write_ptr);
        writable[offset] = data;
    }
    template <typename T>
    T read(const size_t offset = 0)
    {
        T* result = static_cast<T*>(write_ptr);
        return result[offset];
    }
    HANDLE read_handle;
    HANDLE write_handle;
    void* read_ptr;
    void* write_ptr;

    // delete unusable operators and constructors as non-copy object
    memory_mapped_file(const memory_mapped_file&) = delete;
    memory_mapped_file(const memory_mapped_file&&) = delete;
    memory_mapped_file& operator=(const memory_mapped_file& other) = delete;
    memory_mapped_file&& operator=(const memory_mapped_file&& other) = delete;
} mm_file;
int main(int argc, char* argv[])
{
    mm_file mmf(sizeof(int) + sizeof(float));
    mmf.write<int>(20);
    mmf.write(35.876f, sizeof(int));
    std::cout << "mmf read result: (int = " << mmf.read<int>() << "), (float = " << mmf.read<float>(sizeof(int)) << ")" << std::endl;
}

Такая структура упростит вам жизнь, но вам необходимо все-таки вручную вычислять оффсеты, можно придумать какой-нибудь механизм, который бы делал вычисление за вас.

Результатом выполнения будет:

mmf read result: (int = 20), (float = 35.876)

READ ALSO
Синхронизация данных между SQLite и PostgreSQL

Синхронизация данных между SQLite и PostgreSQL

Возникла потребность синхронизации данных с sqlite в postgresqlКоротко говоря все происходит так: sqlite (embeded система) собирает данные и при возможности...

139
Изучение мавен для работы в командной строке [закрыт]

Изучение мавен для работы в командной строке [закрыт]

Может кто порекомендовать ресурсы по изучению мавен как утилиты терминала? Попадавшиеся мне туториалы были в виде "нажмите это, нажмите то

140
Почему matchtemplate работает некорректно?

Почему matchtemplate работает некорректно?

Есть задача: получить изображение с камеры, выделить нужный объект для слежения и следить за ним

178
PlaceAutocomplete с gps кнопкой

PlaceAutocomplete с gps кнопкой

Я установил себе в приложение PlaceAutocomplete и получаю с него latitude и longitudeВсе работает отлично

140