ネロです。プログラム初心者なのでエラーの対処がうまくいきません。
ビルドやコンパイルの時にはエラーは0なんですが、プログラムを実行して、ある関数を呼び出すところにくると、「問題が発生したため”プログラム名”を終了します。ご不便をおかけして申し訳ありません。」と書かれたダイアログボックスが出てきて、プログラムが終了してしまいます。そしてダイアログボックスの”デバッグ”ボタンをクリックすると、”0x00405232”の命令が“0x00019000”のメモリを参照しました。メモリが"read"になることはできませんでした。と書かれたダイアログボックスがでてきます。こういったエラーの原因としてどのようなことが考えられるのでしょうか?教えてください。
あやしいと思われる関数
この関数はあらかじめ2値化された画像をC2[][]という配列に格納して、ハフ変換を行う関数です。この関数を呼び出すと、エラーになってしまいます。
void Hough_2()
{
int i,j,k,l;
int x,y;
int Theta,Rho;
int ThetaMax,RhoMax,CounterMax;
double PIK;
PIK=3.1415926/1024;
//sinとcosのテーブルを用意する(0〜πラジアン)
double *sn,*cs;
sn=new double[1024];
cs=new double[1024];
for(i=0;i<1024;i++){
sn[i]=sin(PIK*i);
cs[i]=cos(PIK*i);
}
//二乗のテーブルを用意する
DWORD sq[320];
for(i=0;i<=320;i++) sq[i]=i*i;
//Counter[1024][1000]用のメモリ領域を確保
WORD* Counter[1024];
for(i=0;i<1024;i++)
Counter[i]=(WORD*)GlobalAlloc(GPTR,1000*sizeof(WORD));
//Hough変換
for(y=0;y<Y_SIZE;y++)
for(x=0;x<X_SIZE;x++)
if(c2[y][x]==0){
for(Theta=0;Theta<1024;Theta++){
Rho=int(x*cs[Theta]+y*sn[Theta]);
Counter[Theta][Rho+500]++;
}
}
//Hough逆変換
for(k=0;k<100;k++){
CounterMax=0;
for(Theta=0;Theta<1024;Theta++)
for(Rho=-500;Rho<500;Rho++)
if(Counter[Theta][Rho+500]>CounterMax){
CounterMax=Counter[Theta][Rho+500];
ThetaMax=Theta;
RhoMax=Rho;
}
if(ThetaMax!=0){
//xを変えてyを描く
for(x=0;x<X_SIZE;x++){
y=(RhoMax-x*cs[ThetaMax])/sn[ThetaMax];
if(y>Y_SIZE-1 || y<0) continue;
c2[y][x]=0;
}
}
if(ThetaMax!=512){
//yを変えてxを描く
for(y=0;y<Y_SIZE;y++){
x=(RhoMax-y*sn[ThetaMax])/cs[ThetaMax];
c2[y][x]=0;
}
}
for(i=-20;i<=20;i++)
for(j=-10;j<=10;j++){
if(ThetaMax+i<0) ThetaMax+=1024;
if(ThetaMax+i>1023) ThetaMax-=1024;
if(RhoMax+j<-500 ||RhoMax+j>499) continue;
Counter[ThetaMax+i][RhoMax+500+j]=0;
Counter[ThetaMax+i][-RhoMax+500+j]=0;
}
}
delete[] sn;
delete[] cs;
for(i=0;i<1024;i++)
GlobalFree(Counter[i]);
}
> そしてダイアログボックスの”デバッグ”ボタンをクリックすると、”0x00405232”の命令が“0x00019000”のメモリを参照しました。メモリが"read"になることはできませんでした。と書かれたダイアログボックスがでてきます。
> こういったエラーの原因としてどのようなことが考えられるのでしょうか?
不正なポインタを利用すると簡単に出ます。
> あやしいと思われる関数
VC++のIDEを使えば,落ちた地点がもっと明確にわかると思いますが。
他にも,printfとかMessageBoxとかを使って,
どこが問題になっているのかをちゃんと絞り込んで下さい。
YuOさんが書かれているように、ステップ実行で、エラーが発生する場所を、
まずはご自分で確かめて下さい。
そして、その周辺のコードを見てもまだ分からない場合は、
その旨を質問されてはどうでしょうか?
少し見ただけでも、
> //二乗のテーブルを用意する
> DWORD sq[320];
> for(i=0;i<=320;i++) sq[i]=i*i;
この部分で、sq[320]にアクセスしているのメモリを破壊しています。
ツイート | ![]() |