Jeg er i gang med at lave et mini bibliotek til at læse bmp filer med i C. Jeg har 2 problemer. Den ene er hvordan allokerer jeg en structure ved brug af malloc/calloc uden at bruge explicit casting som nævnes bør undgås her:
http://en.wikipedia.org/wiki/Calloc#Casting_and_type_safetyDen anden er at nogle af mine pointers på mystisk vis peger på NULL.
Min kode er som følger:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
struct bmp_magic {
unsigned char* magic[2];
};
struct bmp_header {
uint32_t header_size;
uint32_t width;
uint32_t height;
uint16_t color_planes;
uint16_t bpp;
uint32_t compress_type;
uint32_t image_size;
uint32_t hres;
uint32_t vres;
uint32_t colors;
uint32_t important_colors;
};
struct bmp_file {
struct bmp_magic* magic;
struct bmp_header* header;
uint8_t* data;
};
struct bmp_magic* bmp_readMagic(FILE* pfile) {
struct bmp_magic* pMagic = (struct bmp_magic*)calloc(1, sizeof(struct bmp_magic));
if (pMagic == NULL) {
fprintf(stderr, "Error allocating memory!\n");
}
else
{
fread(pMagic->magic, sizeof(unsigned char), 2, pfile);
};
return pMagic;
};
struct bmp_header* bmp_readHeader(FILE* pfile) {
struct bmp_header* pHeader = (struct bmp_header*)calloc(1, sizeof(struct bmp_header));
if (pHeader == NULL) {
fprintf(stderr, "Error allocating memory!\n");
}
else
{
size_t word = sizeof(uint16_t);
size_t dword = sizeof(uint32_t);
fread(&pHeader->header_size, dword, 1, pfile);
fread(&pHeader->width, dword, 1, pfile);
fread(&pHeader->height, dword, 1, pfile);
fread(&pHeader->color_planes, word, 1, pfile);
fread(&pHeader->bpp, word, 1, pfile);
fread(&pHeader->compress_type, dword, 1, pfile);
fread(&pHeader->image_size, dword, 1, pfile);
fread(&pHeader->hres, dword, 1, pfile);
fread(&pHeader->vres, dword, 1, pfile);
fread(&pHeader->colors, dword, 1, pfile);
fread(&pHeader->important_colors, dword, 1, pfile);
};
return pHeader;
};
struct bmp_file* bmp_readFile(FILE* pfile) {
uint8_t* data;
size_t dataSize;
struct bmp_file* file = (struct bmp_file*)calloc(1, sizeof(struct bmp_file));
if (file == NULL) {
fprintf(stderr, "Error allocating memory!\n");
}
else
{
file->magic = bmp_readMagic(pfile);
file->header = bmp_readHeader(pfile);
dataSize = file->header->image_size*sizeof(uint8_t);
data = (uint8_t*)calloc(1, dataSize);
fread(data, dataSize, 1, pfile);
file->data = data;
};
return file;
};
void bmp_freeFile(struct bmp_file* file) {
free(file->magic); file->magic = NULL;
free(file->header); file->header = NULL;
free(file->data); file->data = NULL;
};
int main(char* argv[], int argc) {
struct bmp_file* bmpfile;
FILE* pfile = fopen("C:\\test.bmp", "r");
char dummy;
bmpfile = bmp_readFile(pfile);
if (bmpfile != NULL) {
bmp_freeFile(bmpfile);
}
else
{
fprintf(stderr, "Could not read bmp file!\n");
};
fclose(pfile); pfile = NULL;
printf("Value is: %s\n", bmpfile->magic); //GIVER NULL :S
printf("Press enter to exit!\n");
scanf("%c", &dummy);
return 0;
};
Der er et billede det pågældende sted og jeg kan se at i f.eks. selve magic strukturen bliver magic sat til noget gyldigt tekst og tror at det er ved bmp_readFile at pointeren til denne struktur ikke bliver sat ordentligt. Jeg får ingen af de fejlbeskeder der er mulige så jeg lidt på bar bund.
På forhånd tak for hjælpen.