VS2003でプログラムをつくっています。
MFCでつくっているのですが
Test_Image = new BYTE [256*256];(コンストラクタ)
とメモリ確保して
Test_Image = dlg.Cut_Image;
image_draw_8(pDC,Test_Image,256,256,700,200);(ビットマップ表示用の自作関数)
で一度表示させます。その後別の関数内で
image_draw_8
を使用してTest_Imageを表示させようとすると
"〜〜〜〜でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x011a8000 を読み込み中にアクセス違反が発生しました"というエラーがでます。別関数で呼ばれたときに変数の中身が変わってしまっているようなのですがどう対処すればよいでしょうか?
> Test_Image = new BYTE [256*256];(コンストラクタ)
> とメモリ確保して
> Test_Image = dlg.Cut_Image;
確保したメモリへのポインタを上書きしていますが,問題ないのですか?
# おそらく,ここが問題かと。
レスありがとうございます。
> Test_Image = new BYTE [256*256];(コンストラクタ)
をはずしてやってみたのですが
Test_Image = dlg.Cut_Image;
をしている関数をでるときにも同じようなエラーがでてしまいます。
まちがえました。コンストラクタでメモリ確保せずに
Test_Image = dlg.Cut_Image;
image_draw_8(pDC,Test_Image,256,256,700,200);(ビットマップ表示用の自作関数)
で一度表示させて別の関数内で
image_draw_8
を使用してTest_Imageを表示させようとしてもTest_Imageにアクセスするときに同じエラーがでます。よろしくお願いします。
そもそも,dlg.Cut_Imageって何ですか?
Test_Image = dlg.Cut_Image;
の方が間違いではないかと思うのですが。
というか,ちゃんとデバッガ使ってデバッグしましょう……。
ダイアログをだすクラスを用意していてそこでpublicで宣言した配列です。
すいませんまだプログラム初心者なもので。。。。恥ずかしながらデバッガの使い方もよくわからないのです。
> ダイアログをだすクラスを用意していてそこでpublicで宣言した配列です。
その配列には,十分な領域が確保されているのですか?
とりあえず……
・何のためにTest_Image = new BYTE [256*256];としたのか
・何のためにTest_Image = dlg.Cut_Image;としたのか
をちゃんと考えるみるのがよいかと。
> すいませんまだプログラム初心者なもので。。。。恥ずかしながらデバッガの使い方もよくわからないのです。
デバッガの使用方法を書き出したら,大変な量になってしまいますので,簡単に。
・実行はDebug構成で[デバッグ] - [実行]を使う
・事前にブレークポイントを設定しておく
・ブレークしたら変数(等)の値をウォッチしながらステップ実行
基本はこれだけです。
ちゃんとデバッガで実行していれば,
> "〜〜〜〜でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x011a8000 を読み込み中にアクセス違反が発生しました"
というダイアログは出ないはずです。
# IDEがアクセス違反例外を捕捉するから。
ポインタでデータを渡すのをやめることで解決できました。
クラスのデストラクタのせいでポイントがさす場所がかわってしまっていたからだと考えています。ありがとうございました!
「考えています」では解決できていないですよ。
私は,
・dlg.Cut_Imageの配列容量が65536より小さい
・image_draw_8の中で,65535より大きな値によるアクセスをしている
・image_draw_8の中で,0より小さい値によるアクセスをしている
のどれかが原因ではないかと疑っていたのですけどね。
ツイート | ![]() |