2014-01-10 6 views
0

мне нужна помощь с чем-то ... Я занимаюсь разработкой простой 2D игры, и я коплю игровую карту в файл с структуры, написанные на ней, как это:Расчет размера класса для записи

void MapSystem::SetMapInfo(char* Filename, MapInfo* mapInfo) 
{ 
    HANDLE hFile = CreateFile(Filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
    if (hFile == INVALID_HANDLE_VALUE) 
     return; 
    DWORD dwSize = GetFileSize(hFile, NULL); 
    SetFilePointer(hFile, NULL, NULL, FILE_BEGIN); 
    DWORD Written; 
    WriteFile(hFile, (void*)&mapInfo, sizeof(MapInfo), &Written, NULL); 
    CloseHandle(hFile); 
} 

а вот мой класс MapInfo:

struct Tile 
{ 
    D3DXVECTOR2 Pos; 
    int Id; 
}; 

class MapInfo 
{ 
public: 
    D3DXVECTOR2 Size; 
    int Count; 
    Tile Tiles[]; 
}; 

моей проблема: Когда я использовать SizeOf (MapInfo) возвращает 12, я считаю, что компилятор обрабатывает плитки [] как указатель, и из-за того, что он Безразлично 't сохранить массив Tiles, и даже если я вычислил новый размер, вот так:

DWORD newSize = sizeof(MapInfo)+(mapInfo.Count*sizeof(Tile)) 

Функция WriteFile не записывает ее должным образом, у кого есть способ ее исправить?

+0

Как распределяется «Плитка»? Если это указатель (например, назначенный с помощью 'new' или' malloc'), вам придется записать данные, которые он указывает отдельно. –

+0

Я просто использую mapInfo.Tiles [0] .Id = 1, ничего не выделять – user3124543

+0

Как вы думаете, данные идут? C++ старые массивы не выделяют себя. –

ответ

2

Этот код недействителен в C++. Использование гибких массивов - это функция C и может быть реализована некоторыми компиляторами на C++. Но это не стандартная функция C++. Таким образом, с точки зрения C++ это определение

class MapInfo 
{ 
public: 
    D3DXVECTOR2 Size; 
    int Count; 
    Tile Tiles[]; 
}; 

недействителен. Вы должны указать размер массива, используя выражение const.

Или использовать std :: vector вместо массива

+0

ОК, я буду использовать std :: vector, спасибо! – user3124543

+0

std :: vector MyVector; \t MyVector [0] = 1; Почему это держится? – user3124543

+0

Используйте вместо этого std :: vector MyVector (1, 1); Или std :: vector MyVector; MyVector.push_back (1); Что касается вашего кода, то ваш вектор еще не имеет элементов, и поэтому вы не можете использовать оператор индекса. Нет такого элемента, как MyVector [0] –

Смежные вопросы