実行時エラーの原因?


ネロ  2004-12-01 02:42:58  No: 55409

ネロです。プログラム初心者なのでエラーの対処がうまくいきません。
ビルドやコンパイルの時にはエラーは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]);

}


YuO  2004-12-01 05:55:16  No: 55410

> そしてダイアログボックスの”デバッグ”ボタンをクリックすると、”0x00405232”の命令が“0x00019000”のメモリを参照しました。メモリが"read"になることはできませんでした。と書かれたダイアログボックスがでてきます。
> こういったエラーの原因としてどのようなことが考えられるのでしょうか?

不正なポインタを利用すると簡単に出ます。

> あやしいと思われる関数

VC++のIDEを使えば,落ちた地点がもっと明確にわかると思いますが。

他にも,printfとかMessageBoxとかを使って,
どこが問題になっているのかをちゃんと絞り込んで下さい。


KING・王  2004-12-01 17:04:20  No: 55411

YuOさんが書かれているように、ステップ実行で、エラーが発生する場所を、
まずはご自分で確かめて下さい。

そして、その周辺のコードを見てもまだ分からない場合は、
その旨を質問されてはどうでしょうか?

少し見ただけでも、
> //二乗のテーブルを用意する
> DWORD sq[320];
> for(i=0;i<=320;i++) sq[i]=i*i;

この部分で、sq[320]にアクセスしているのメモリを破壊しています。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加