user198736
user198736

Reputation:

Why do I get error: incompatible types in assignment?

I am trying to read the header from a bitmap file. When I compile I get the following error; "error: incompatible types in assignment" for the line that does "bmp_header_p = bmp->header;". What am I doing wrong here?

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;
        }   
} 

Upvotes: 0

Views: 875

Answers (1)

crowder
crowder

Reputation: 724

struct _bmpfile {
  bmp_header_t header;
  bmp_dib_v3_header_t dib;

  rgb_pixel_t **pixels;
  rgb_pixel_t *colors;
};

This "header" is not a pointer.

bmp_header_t *bmp_header_p;

This one is. The compiler is griping at you because you're trying to assign a non-pointer thing to a pointer thing. These types are different.

Looking at your code, you don't actually need or want this assignment at all, you don't even need the malloc, assuming your bmp object is already allocated by the caller:

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;
        }   
} 

Upvotes: 3

Related Questions