こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}
です。よろしくお願いします。

投稿日時 - 2007-05-15 16:11:22

QNo.3002254

困ってます

質問者が選んだベストアンサー

このエラーは、その変数名が メモリ破壊しているときに発生します。
100個のデータしか入らないところに101個目を入れたときとか。
(1)ポインタと実体を間違っていないか
(2)構造体のバウンダリに誤りがないか
など、調べてみてくださいな。


BMP rp={0};
RESULT res={0};
構造体ポインタ配列でないのに、こんなことができているのが不思議。。。

投稿日時 - 2007-05-15 17:32:47

お礼

お礼が遅くなりまして、
申し訳ございません。
無事にエラーをとることができました。
BMP rp={0}などはたまたま近くにいた人がおしえてくれました(汗)
本当にありがとうございました。

投稿日時 - 2007-05-18 16:34:45

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

なんとなく, keisan の中で j のクリアをしていないような気がするんですが....
ちなみにですが>#1
BMP rp = {0};
なんてのは OK です. この場合, rp の最初のメンバが 0 になり, その副作用として構造体の全てのメンバが 0 になります.

投稿日時 - 2007-05-15 20:55:12

お礼

お礼が遅くなりまして、
申し訳ございません。
jのクリアをしたところ、
おかげさまでエラーがなくなりました。
ありがとうございました。

投稿日時 - 2007-05-18 16:33:02