2016-02-08 2 views
-2

Код для чтения изображения bmp с использованием структурных переменных и массива struct. Просьба предложить мне правильный способ сделать типажей к таНос (ошибки, перечисленные ниже код):Ошибки кастинга в malloc для массива «char» на языке C

#include<stdio.h> 
#include<stdlib.h> 

typedef struct bands{ 
/* .bmp image store pixel colors in "bgr" sequence */ 
unsigned char b,g,r; //in 24bit bmp, we need to use 8bit datatype for each color 
}bands; 

int main() 
{ 
FILE *bmpimage; //ptr to read image file 
FILE *redpix,*greenpix,*bluepix; //ptr to create band/color wise file 
unsigned short pix_x=223,pix_y=197; /*pix_x: no. of pixels in a row, pix_y: no. of pixels in a column of input image*/ 
unsigned short n_pix=pix_x*pix_y; /*variable to count total no. of pixels*/ 

bmpimage=fopen("blocks223x197.bmp","r"); //24 bit bmpimage 
redpix=fopen("redpixels.txt","w"); 
greenpix=fopen("greenpixels.txt","w"); 
bluepix=fopen("bluepixels.txt","w"); 

/* Define a pointer to a memory block,'*readbuffer', 
that has 'n_pix' no. of memory blocks each of size same as struct bands */ 
bands *readbuffer=(char*)malloc(n_pix*sizeof(*readbuffer)); 

int n; 
//Create memory for each of 'n_pix' no. of pixel array of each color 
for(n=0;n<n_pix;n++){ 
    unsigned char *readbuffer[n].b = (char*) malloc(sizeof(readbuffer[n].b)); 
    unsigned char *readbuffer[n].g = (char*) malloc(sizeof(readbuffer[n].g)); 
    unsigned char *readbuffer[n].r = (char*) malloc(sizeof(readbuffer[n].r)); 
} 

if(!bmpimage){printf("Error reading bmpimage!");return 1;} 
if(readbuffer==NULL){printf("NULL buffer"); exit(1);} 

/* Go to 54th byte to access pixelvalue data (since, 24bit bmp format) */ 
fseek(bmpimage,54,SEEK_SET); 

/* Read 'n_pix' no. of 'bgr' blocks each of which are of the size same as "struct bands" */ 
fread(readbuffer,sizeof(bands),n_pix,bmpimage); /*read 'n_pix' no. of 'bgr' blocks each of which are of the size same as "struct bands" to the memory address, 'readbuffer' or '&readbuffer[0]' */  

int n_blocks=(sizeof(readbuffer)/sizeof(bands)); 
printf("no. of blocks read= %d, n_pix=%d",n_blocks,n_pix); 


int i,j; int count; count=0; 
/* logic to print pixel values in correct order*/ 

for(i=pix_y;i>0;i--){ /*for accessing row data. Choose to print from bottom to top*/ 
for(j=1;j<=pix_x;j++){ /*for accessing column data. Print from left to right*/ 

    if(j!=pix_x){ 
    fprintf(redpix,"%d,",readbuffer[(i-1)*pix_x + j].r); 
    fprintf(greenpix,"%d,",readbuffer[(i-1)*pix_x + j].g); 
    fprintf(bluepix,"%d,",readbuffer[(i-1)*pix_x + j].b); 
    } 
    else{ 
     count++; 
    fprintf(redpix,"%d\n",readbuffer[(i-1)*pix_x + j].r); 
    fprintf(greenpix,"%d\n",readbuffer[(i-1)*pix_x + j].g); 
    fprintf(bluepix,"%d\n",readbuffer[(i-1)*pix_x + j].b); 
    } 
    } 
} 

// free allocated memory 
for(n=0;n<n_pix;n++){ 
    free(readbuffer[n].b) ; 
    free(readbuffer[n].g) ; 
    free(readbuffer[n].r) ; 
} 


fclose(bmpimage);fclose(redpix);fclose(bluepix);fclose(greenpix); 

return 0; 

} 

Ссылки: How to properly malloc for array of struct in C

malloc an array of struct pointers vs array of structs

Список ошибок:

bmpread_check.c: In function 'main': bmpread_check.c:24:19: warning: initialization from incompatible pointer type >[enabled by default] bands readbuffer=(char)malloc(n_pix*sizeof(*readbuffer)); ^ bmpread_check.c:29:33: error: expected '=', ',', ';', 'asm' or 'attribute' >before '.' token unsigned char readbuffer[n].b = (char)malloc(sizeof(readbuffer[n].b)); ^ bmpread_check.c:29:33: error: expected expression before '.' token bmpread_check.c:30:33: error: expected '=', ',', ';', 'asm' or 'attribute' >before '.' token unsigned char readbuffer[n].g = (char)malloc(sizeof(readbuffer[n].g)); ^ bmpread_check.c:30:33: error: expected expression before '.' token bmpread_check.c:31:33: error: expected '=', ',', ';', 'asm' or 'attribute' >before '.' token
unsigned char readbuffer[n].r = (char)malloc(sizeof(readbuffer[n].r)); ^ bmpread_check.c:31:33: error: expected expression before '.' token bmpread_check.c:69:5: warning: passing argument 1 of 'free' makes pointer from >integer without a cast [enabled by default] free(readbuffer[n].b) ; ^ In file included from bmpread_check.c:3:0: c:\mingw\include\stdlib.h:357:38: note: expected 'void ' but argument is of >type 'unsigned char' _CRTIMP void __cdecl __MINGW_NOTHROW free (void); ^ bmpread_check.c:70:5: warning: passing argument 1 of 'free' makes pointer from >integer without a cast [enabled by default] free(readbuffer[n].g) ; ^ In file included from bmpread_check.c:3:0: c:\mingw\include\stdlib.h:357:38: note: expected 'void ' but argument is of >type 'unsigned char' _CRTIMP void __cdecl __MINGW_NOTHROW free (void); ^ bmpread_check.c:71:5: warning: passing argument 1 of 'free' makes pointer from >integer without a cast [enabled by default] free(readbuffer[n].r) ; ^ In file included from bmpread_check.c:3:0: c:\mingw\include\stdlib.h:357:38: note: expected 'void ' but argument is of type >'unsigned char' _CRTIMP void __cdecl __MINGW_NOTHROW free (void); ^

+2

Что ваш вопрос? –

+0

Неверно посмотреть ссылку на изображение «Список ошибок» –

+0

'band * readbuffer = (band *) malloc (n_pix * sizeof (* readbuffer));' или лучше 'диапазоны * readbuffer = malloc (n_pix * sizeof (* readbuffer)); '. Члены b, g, r не являются указателями, вам не требуется выделение для них. –

ответ

1

Этот :

bands *readbuffer=(bands*)malloc(n_pix*sizeof(bands)); 

(Примечание: не *readbuffer. It's bands)

уже выделенная память для всех n_pix групп.

Нет необходимости выделять память для b, g, r, поскольку они не указатели.

Так,

//Create memory for each of 'n_pix' no. of pixel array of each color 
// And allocating using for loop 

не требуется.

+0

И тип cast должен быть либо изменен на '(band *)', либо полностью удален. –

+0

@GNKeshava Согласно моей проверке, не имеет значения, использую ли sizeof (диапазоны) или sizeof (* readbuffer), так как они имеют одинаковый размер. –

+0

Ваше предложение было полезным Martin Zabel. –

1

Переменные b, g & r не являются указателями, но беззнаковыми 8-битными переменными. Таким образом, правильный способ выделения памяти для этого случая состоит в том, чтобы выделить массив этой структуры с размером общего количества пикселей, то есть шириной по высоте высоты изображения.

Это может быть достигнуто путем динамического выделения указателя структуры bands* следующим образом.

bands *readbuffer = malloc(n_pix * sizeof(bands));

Это Постулаты бы выделить время структуры n_pix, так что вы можете инициализировать и пиксельный доступ значения b, g & r в каждом отдельном пикселе следующим образом.

readbuffer[i]-> b = 20; 
readbuffer[i]-> g = 80; 
readbuffer[i]-> r = 40; 

Где i может быть что угодно, от 0 к n_pix-1

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