2013-06-28 3 views
0

J'essaie de lire l'en-tête d'un fichier bitmap. Lorsque je compile, j'obtiens l'erreur suivante: "erreur: types incompatibles dans l'affectation" pour la ligne qui fait "bmp_header_p = bmp-> header;". Qu'est-ce que je fais mal ici?Pourquoi ai-je une erreur: types incompatibles dans l'affectation?

struct _bmpfile { 
    bmp_header_t header; 
    bmp_dib_v3_header_t dib; 

    rgb_pixel_t **pixels; 
    rgb_pixel_t *colors; 
}; 

typedef struct _bmpfile bmpfile_t; 

bool 
bmp_get_header_from_file(FILE *filename, bmpfile_t *bmp) 
{ 
     bmp_header_t *bmp_header_p; 
     bmp_header_p = bmp->header; 

     fseek(filename, 0L, SEEK_SET); 
     bmp_header_p = malloc(sizeof(bmp->header)); 

     if(14 != fread(bmp_header_p, sizeof(char), 14, filename)) { 
       perror("message"); 
       return FALSE; 
     } else { 
       return TRUE; 
     } 
} 

Répondre

3
struct _bmpfile { 
    bmp_header_t header; 
    bmp_dib_v3_header_t dib; 

    rgb_pixel_t **pixels; 
    rgb_pixel_t *colors; 
}; 

Cette "tête" est pas un pointeur.

bmp_header_t *bmp_header_p; 

Celui-ci est. Le compilateur vous poignarde parce que vous essayez d'attribuer une chose sans pointeur à une chose pointeur. Ces types sont différents.

En regardant votre code, vous ne pas vraiment besoin ou si vous voulez cette tâche à tous, vous n'avez même pas besoin du malloc, en supposant que votre objet bmp est déjà attribué par l'appelant:

bool 
bmp_get_header_from_file(FILE *filename, bmpfile_t *bmp) 
{ 
     fseek(filename, 0L, SEEK_SET); 

     if(sizeof(bmp_header_t) != fread(&bmp->header, sizeof(bmp_header_t), sizeof(char), filename)) { 
       perror("message"); 
       return FALSE; 
     } else { 
       return TRUE; 
     } 
} 
+0

En effet. Si ce n'est pas vraiment un pointeur, alors ajoutez le '&' pour obtenir l'adresse de la variable. – Jite

+0

Quelle serait la syntaxe de l'appelant pour l'allouer? –

+0

struct _bmpfile bf; (ceci en construira un sur la pile, ce qui est bien si vous êtes dans main() ou quelque part vous pouvez contrôler la durée de vie de la variable (c'est-à-dire que la variable est indésirable lorsque cette fonction est terminée) devrait faire: struct _bmpfile * bf = (_bmpfile *) malloc (sizeof (_bmpfile)); Si vous faites la version automatique (sans malloc), vous appelez votre routine get_header comme suit: success = bmp_get_header_from_file (fichier, &bf); sinon vous ferez (bmp_get_header_from_file (fichier, bf), puisque bf sera un pointeur – crowder