ページ 11

サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 11:46
by Logic
初めまして、今日からCを学び始めようと思う初心者です。

ゲームプログラミングの館を初めから読んで進めているのですが、
プログラムをコンパイルして実行すると、説明通り正常に起動できても終了時にエラーが出ます。
ソースには「WaitKey() ;//何か入力があるまで待つ関数」と書いてあるのでエンターキーを押して終了させましたが、
DxLib.exe の 0x024d3645 で初回の例外が発生しました: 0xC0000005: 場所 0xfeeeff6a を読み込み中にアクセス違反が発生しました。
DxLib.exe の 0x024d3645 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeeff6a を読み込み中にアクセス違反が発生しました。
というエラーが表示され、以降よく分からない状態になってしまいます。

DXライブラリの設定がどこか間違っているのでしょうか?

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 12:30
by kazuoni
Logicさんの書かれたエラーはデバッグモードで引っかかったところです。
何章まで進んでいますか?
おそらくコードに記述ミスがあると思います。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 12:56
by Logic
返信ありがとうございます。
現時点で読み終えているのは入門編の8までです。

ですが、全てのコードにおいて、実行すると同じエラーが発生します。
もちろん、DXライブラリの使い方説明に載せられているコード
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}

DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ

WaitKey() ; // キー入力待ち

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}

をそのままコピーして実行しても、終了時に上記のエラーが発生します。
未熟な説明ですが、もし分かるのでしたらどうか教えてください。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 13:18
by SCI
使用しているコンパイラなどを記述すると回答が得やすいのでは?

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 13:53
by Logic
返信ありがとうございます。
今回初めて導入しましたので、VisualC++2008 Express Editionをインストールし、使用しています。

ちなみに、入門編11での「キーを入力すると終了する」をして終了させても、同様のエラーが発生してしまいます。

DXライブラリの設定を見直していますが、まだ解決していません。
他に確認すべき事項がありましたら御助言よろしくお願いします。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 15:20
by Dixq (管理人)
今まで正常に動作したプログラムコードはありますか?
実際にプロジェクトに入っているソースと、プログラムを書いているソースのファイルが違うのではないでしょうか?
プロジェクトのファイルは、プロジェクトの中に存在(関連付け)しているファイルに書かないとコンパイルできません。
ひょっとして、VC++の画面にソースファイルか何かをドラッグアンドドロップしただけなんじゃないでしょうか。
すると、いくらソースを書いても変化ありません。

DXライブラリのリファレンスにあるサンプルをどれでもいいのでやってみて下さい。
どれをやっても同じエラーが出る場合、その可能性が高いです。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 17:18
by Logic
返信ありがとうございます。

>今まで正常に動作したプログラムコードはありますか?
全て同じエラーが出ます。

説明されている事が全く理解できないのですが、

>VC++の画面にソースファイルか何かをドラッグアンドドロップしただけ
というのは、(DXライブラリ 使い方説明のページにおいて)Source Fileの中にDrawPixel.cppを作成し、設定をしてからそこに
---
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}

DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ

WaitKey() ; // キー入力待ち

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}
---
を入力、デバッグ→デバッグ開始を行うだけでは不十分だということでしょうか?

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 17:26
by dic
WaitKey()か
DxLib_End()か
return 0;のところか
どこで例外が発生しているのかを明確にしないと
答えようがないかと思います

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 17:26
by Dixq (管理人)
Vc++のソリューションエクスプローラーの欄にそのソースファイルはありますか?
ソリューションエクスプローラーが解らない時はゲームプログラミングの館の0章をご覧下さい。
ソリューションエクスプローラーのソースファイルをダブルクリックして出てきたファイルにソースを書いて下さい。
それでも解決しない時はこちらにプロジェクトのあるフォルダごとzipファイルか何かに圧縮して送って下さい。
どこが悪いのか見てみます。
dixqhp@gmail.com

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 17:50
by Justy
 何かしらの不整合が発生しているようにも見えますね。


>デバッグ→デバッグ開始を行うだけでは不十分だということでしょうか?

 ではその状態でアクセスエラーが出たときの「呼び出し履歴」の状態は
どうなっていますでしょうか?

 呼び出し履歴ウインドウはデバッグメニューのウインドウの中にあります。
 この情報を見ると、どの関数の中に問題があるのか判る可能性があります。


 もし管理人さんに見てもらうので有れば、ソースコードなどの
プロジェクト一式(使っているDXライブラリも含めて)だけでなく
止まった時の状態を再現するためにエラーが出た時の状態のダンプも
一緒に付けておくといいでしょう。

 ダンプは「デバッグメニュー」の「名前を付けてダンプを保存」で保存できます。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 18:30
by Dixq (管理人)
・・と、いいつつ、複雑な事だとわかる自信がありません(汗
どこかのアップローダに上げて、みんなに見てもらってはどうでしょう?

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 19:17
by Logic
>WaitKey()か
>DxLib_End()か
>return 0;のところか
>どこで例外が発生しているのか
すみません、それよく理解できていなくて……。

>送って下さい。
実行ファイルは送れないようになっていたため、それ以外のprojectとDXライブラリをzipファイルにまとめて送りました。

>呼び出し履歴
デバッグでの終了時に現れた呼び出し履歴は以下の通りです。
RFVibraPS.dll!010d3645()
[下のフレームは間違っているか、または見つかりません。RFVibraPS.dll に対して読み込まれたシンボルはありません。]
RFVibraPS.dll!010d3c96()
kernel32.dll!76224911()
ntdll.dll!776be4b6()
ntdll.dll!776be489()

これが初歩的な問題なのかどうかなのかすらわからず(多分初歩的なものだと思いますが)、ここにいる方皆に迷惑をかけてしまい、本当にすみません。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 21:15
by Justy

>デバッグでの終了時に現れた呼び出し履歴は以下の通りです

 なるほど。
 エラーが出たときのアドレス 0x024d3645と呼び出し履歴の位置が一致していない
ということは別のところですね。

 うーん、ちょっと弱りましたね。
 掲示板で解決するのはだんだん難しくなってきました。


・ dicさんが書いていますが、どこで落ちているのかをみるため、
 DxLib_End()の後に、
MessageBoxA(0, "END <DxLib_End>", "Success", MB_OK);
 の1行を入れて、実行してみて下さい。

 メッセージボックスは表示されますか?

・ デバッグメニューのウインドウの中にある「スレッド」ウインドウの
中身はどうなっていますか?

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 22:22
by Logic
> DxLib_End()の後に、
>MessageBoxA(0, "END <DxLib_End>", "Success", MB_OK);
> の1行を入れて、実行してみて下さい。

入れて実行してみましたが、結果は入れる前と何も変化はありませんでした。
メッセージボックスは表示されません。

>「スレッド」ウインドウの中身
0 4328 メインスレッド   メインスレッド WinMain 標準 0
0 5780 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
0 3444 RPC スレッド   RPC コールバック スレッド 774a9a94 標準 0
0 192 RPC スレッド   RPC コールバック スレッド 774a9a94 標準 0
0 2224 ワーカー スレッド ProcessMessageThreadFunction 774a9a94 標準 0
0 1788 ワーカー スレッド Win32 スレッド 02803645 標準 0
0 620 ワーカー スレッド Win32 スレッド 774a9a94 最高 0
0 3172 ワーカー スレッド Win32 スレッド 774a9a94 タイム クリティカル 0
0 5960 ワーカー スレッド Win32 スレッド 774a9a94 タイム クリティカル 0
0 4232 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
0 1636 ワーカー スレッド Win32 スレッド 774a9a94 -3 0
0 5584 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
0 388 ワーカー スレッド Win32 スレッド 774a9a94 標準 0
以上の通りです。
WinMainを除いて、何故か一つだけ場所が774a9a94でない物があります。
黄色い→が付いているので、これがおかしなところなのでしょうか?

管理人様にアップローダへのアドレスを送りましたが、こちらでも公開します。
http://uproda11.2ch-library.com/src/11144875.zip.shtml
DL Key:vc
です。
掲示板汚しですみません。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 22:59
by Justy

>WinMainを除いて、何故か一つだけ場所が774a9a94でない物があります

 なるほどなるほど。
 大分絞れてきました。

 スレッドの状況とメッセージボックスが出ないこと、
WaitKey()まで実行できていたこと、合わせて考えると、
全ての情報が DxLib_End()の中で問題が起きていることを指し示しています。

 さらに Log.txtの状況からみるに、ジョイパッドかキーボードのデバイスの解放関連で
コケているようにもみえます。

 しかし残念なことに私の環境では再現しないようです。
 添付されていた実行ファイルを実行しても特に問題なく終了できましたので、
何かの環境に起因するものだと思われます。


 ひょっとして PCに何かジョイパッドが刺さっていませんか?
 もし刺さっていたらちょっと抜いてから実行して試してみて下さい。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 23:17
by Logic
> PCに何かジョイパッドが刺さっていませんか?
私はパソコンでよくゲームをしているのでジョイパッドはいつも差しっぱなしです。

>抜いてから実行
抜いてもう一度実行してみたところ、エラーが消え、すんなりと何の問題もなく終了しました。
ということは、ジョイパッドを差したまま実行するとエラーが出るのですね。よくわかりました。

>この場を作って頂いた管理人様、解答を頂いたJusty様及び助言をしてくださった方々
こんな超がつく初心者の私を見捨てず付き合っていただき、本当にありがとうございました。
できればまたここにのこのこと質問に来るようなことは避けたいですが、もしそうなったとしても、もう少し知識を付けていられるようになりたいと思います。

本当にありがとうございました。

Re:サンプルプログラムで、終了時にエラー

Posted: 2008年12月28日(日) 23:35
by Justy

>抜いてもう一度実行してみたところ、エラーが消え、すんなりと何の問題もなく終了しました。

 それは良かったです。
 さっきの呼び出し履歴のところで RFVibraPS.dllとあり、これが関連しているか
そのときはちょっと自信が無かったのですが、やはりそのあたりだったようです。



>ということは、ジョイパッドを差したまま実行するとエラーが出るのですね。

 本来は問題ないはずなのですが、(ドライバーか何かと)相性が悪いのかも
しれませんね。