debugエラーについて
VisualC++初心者です。
力を貸してください。
内容はDEBUG ERRORで
Stack around the variable "rp" was corrupted
Stack around the variable "res" was corrupted
とでてしまいます。
構造体等は省略しました。
#include <stdio.h>
#include <stdlib.h>
#define N 8
typedef struct{
int maxi,maxj,akarusa[N][N];
unsigned char *data;
}RESULT;
int bunkatsu(BMP *rp,BMP *wp);
int keisan(BMP *rp,BMP *wp);
RESULT *max(RESULT *res);
/* 画像の取込 */
int ReadHeader(BMP *p,FILE *fp){
unsigned int size;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
fread(&p->Bmpf.bfType, sizeof(unsigned short), 1, fp);
fclose(fp);
exit(1);
}
fread(省略)
return 0;
}
int ReadBmp(BMP *p,FILE *fp){
int dummy, byte, i, j, pixel;
unsigned char *ReadBody=0;
ReadHeader(p,fp);
byte = p->Bmpi.biBitCount/8;
dummy = (p->Bmpi.biWidth%4)?(4-(p->Bmpi.biWidth*byte)%4) : 0;
pixel = ((p->Bmpi.biWidth)*byte+dummy)*p->Bmpi.biHeight;
ReadBody = (unsigned char*)calloc(pixel,sizeof(char));
p->body = (unsigned char*)calloc(pixel,sizeof(char));
p->blue = (unsigned char*)calloc((pixel/byte),sizeof(char));
p->green = (unsigned char*)calloc((pixel/byte),sizeof(char));
p->red = (unsigned char*)calloc((pixel/byte),sizeof(char));
fread(ReadBody,1,pixel,fp);
if(p->Bmpi.biBitCount == 8){
printf("\n");
for(j=0;j<p->Bmpi.biHeight;j++){
for(i=0;i<p->Bmpi.biWidth;i++){
p->blue[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbBlue;
p->green[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbGreen;
p->red[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbRed;
}
}
for(j=0;j<p->Bmpi.biHeight;j++){
for(i=0;i<p->Bmpi.biWidth;i++){
p->body[(p->Bmpi.biWidth+dummy)*j+i]=ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)+i];
}
}
}
else if(p->Bmpi.biBitCount == 24 || p->Bmpi.biBitCount == 32){
for(j=0;j<p->Bmpi.biHeight;j++){
for(i=0;i<p->Bmpi.biWidth;i++){
p->blue[(p->Bmpi.biWidth+dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte];
p->green[(p->Bmpi.biWidth+dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte+1];
p->red[(p->Bmpi.biWidth + dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte+2];
}
}
}
else{
printf("失敗\n");
exit(1);
}
free(ReadBody);
return 0;
}
/* 480×480にする */
int bunkatsu(BMP *rp,RESULT *res){
int x,y,a=0;
for(y=0;y<rp->Bmpi.biHeight;y++){
for(x=79;x<rp->Bmpi.biWidth-80;x++){
res->data[a] = rp->blue[y*rp->Bmpi.biWidth+x]+rp->green[y* rp->Bmpi.biWidth+x]+rp->red[y*rp->Bmpi.biWidth+x];
a++;
}
}
return 0;
}
/* ブロック分けして各ブロックの明るさを計算する */
int keisan(BMP *rp,RESULT *res){
int b,c,x,y,i=0,j=0;
for(y=0;(y+60)<rp->Bmpi.biHeight;y+=60){
for(x=0;(x+60)<(rp->Bmpi.biWidth-160);x+=60){
for(b=0;b<60;b++){
for(c=0;c<60;c++){
res->akarusa[i][j]+=res->data[(y+b)*rp->Bmpi.biWidth+(x+c)];
}
}
j++;
}
i++;
}
max(res);
return 0;
}
/* 一番明るいブロックの特定 */
RESULT *max(RESULT *res){
int MAX1=0,MAX2=0,i=0,j=0;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
printf("[%d][%d]=%d",i+1,j+1,res->akarusa[i][j]);
if(MAX1<res->akarusa[i][j]){
MAX1=res->akarusa[i][j];
res->maxi=i;
res->maxj=j;
}
}
printf("\n");
}
printf("一番明るいブロックは[%d][%d]です\n",res->maxi+1,res->maxj+1);
return 0;
}
int main(void){
BMP rp={0};
RESULT res={0};
FILE *fp;
/* 画像の取り込み */
fp=fopen("LED1.bmp","rb");
ReadBmp(&rp,fp);
res.data = (unsigned char*)calloc(rp.Bmpi.biWidth*rp.Bmpi.biHeight,sizeof(char));
fclose(fp);
fp=0;
bunkatsu(&rp,&res);
keisan(&rp,&res);
return 0;
}
です。よろしくお願いします。
お礼
ご回答、ありがとうございます。 今回はよい勉強になりました。ありがとうございました。