› Foros › Multiplataforma › Desarrollo
#pragma pack(push, 1)
struct MulCell
{
u16 TileID;
s8 Z;
};
struct MulBlock
{
MulCell cells[8][8];
};
#pragma pack
CthulhuRlz escribió:Si, eso lo he probado y nada, sigue dando los mismos valores incorrectos.
Lei en el foro de gbadev que en vez de utilizar desde windows el fwrite para crear el archivo y el fread para leerlo en nds, que lo haga con fprintf y fscanf... voy a probar.
void UOMap::getBlock(u16 x, u16 y, MulBlock *block)
{
x %= width;
y %= height;
u32 blockID = (x / 8) * (height / 8) + (y / 8);
u32 offset = blockID * 196;
fseek(fmap, offset, SEEK_SET);
unsigned int header;
fread(&header,4, 1, fmap);
//int h = fread(&block->cells, 3, 64, fmap); <---- metodo alternativo pero que da los mismos resultados.
for(int i = 0; i < 8; i++)
{
for(int j = 0; j < 8; j++)
{
fread(&block->cells[i][j].TileID, 2, 1, fmap);
fread(&block->cells[i][j].Z, 1, 1, fmap);
}
}
}
Mi recomendacion seria de que siempre que puedas trates de ordenar los datos de una estructura de forma que la alineacion a 4 se mantenga y con eso evitaras problemas.
Utilizar el pragma te da la posibilidad de acceder a los datos con ciertas restricciones y ademas, te va a penalizar en velocidad, asi que no parece nada interesante utilizar estructuras desalineadas, salvo que no haya otra solucion posible.
CthulhuRlz escribió:Hmmm!
La estructura esta alineada a 3 (unsigned short = 2, signed char = 1), por lo que quedaria un byte suelto por ahi, lo que no entiendo es porque los primeros 64 grupos los lee bien y el resto no.
En fin, aqui posteo el codigo que utilizo para leer, espero que entre todos podamos sacar algo en claro de todo esto.
Edit:
Entonces, deberia añadir a la estructura un char "basura" para que este alineada a 4? En este archivo me da igual cambiarlo y añadir/suprimir cosas, pero en los otros...