ページ 1 / 1
ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 16:38
by TMS
はじめまして
自分はこちらのサイトを参考に現在ゲームを作ろうとしている者です
今回、原因のわからないエラーに出くわしてしまい、質問させていただきました
エラーはファイルの読み込み関係で起きています
コンパイルはエラーなく通過するのですが
実行中、以下の関数でfopen_sの部分を処理しようとするとき
「ハンドルされていない例外が発生しました」とエラーメッセージが出てプログラムが中断されてしまいます
*FileNameには"Map/MapData000.txt"を入れています
実際には以下の関数はもう少し長いのですがブレイクポイントを使って
以下の部分しか関係ないと判断して、省略しました
int LoadMap(const char *FileName)
{
FILE *fp;//ファイルポインタ
fopen_s(&fp,FileName,"r");
if (fp == NULL) return -1;
return 0;
}
不鮮明なところがありましたらすみません
何とぞお願いします
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 16:44
by TMS
すみません環境を書き忘れてしまいました
WindowsVista、C言語、MS VisualStadio2008
です
よろしくお願いします
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 16:49
by kazuoni
えっと、考えられるのは、
・FileNameに終端文字が格納されていない
・関数を抜けるときにfcloseをしていない
ですかね。
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 17:45
by Mist
fopen_sを使用する場合は、ファイルオープン出来たかどうかはfopen_sの戻り値でチェックしてください。
MSDN読みましたけどfopen_sはファイルオープン失敗時にfpにNULLはセットしてくれないみたいです。
if (fopen_s(&fp,FileName,"r")) {
return -1;
}
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 17:47
by Mist
追加
失敗時には「fpの内容を変更しない」とあるのでfpにあらかじめNULLをセットするのもいいかもしれません。
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 18:52
by TMS
早々の回答ありがとうございます
ですが
>fopen_sの戻り値でチェック
>fpにあらかじめNULLをセット
>関数を抜けるときにfclose
どれもやってみたのですが、結果は変わりませんでした
ただ一つ、自分が無学なもので
>FileNameに終端文字が格納されていない
をどのようにすればよいのかわかりませんでした
ご迷惑かけてすみませんが、どうぞご教授お願いします
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 19:10
by MNS
全然関係ないかもしれませんが、
"Map/MapData000.txt"
これを
"Map\\MapData000.txt"
このように書き換えてみてください。
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月21日(木) 19:23
by Mist
関数をコールする時に
LoadMap("Map/MapData000.txt");
というようにしているということですよね。
であれば、終端コードは問題ないと思います。
少なくとも提示されているソースだけでは例外を発生させるような原因は見つけられませんが、ステップ実行をしたときにどこで例外が発生するのでしょうか?
fopen_sですか?
それとも提示されていない部分ですか?
もう少し情報がないと回答できそうにないです。
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月22日(金) 08:06
by TMS
すみませんでした
ここに投稿させていただく前に、ブレークポイントを使って自分なりにエラーの位置を判断したつもりだったんですが
Mistさんの回答から、ステップ実行で確認してみたところ
エラーは上記のソース部分ではなかったことがわかりました
素人の勘違いで皆様に無駄な時間をとらせてしまい本当にすみませんでした
また、エラーはsscanf関数部分で起きていました
自分自身としてsscanfは使い方を完全に理解できていない部分だったので
もしよろしければ、詳しい使い方等ご教授お願いします
エラーに関してはできる限り自分で解決したいので、sscanfを使う際の注意点などをお教えいただけるとうれしいです
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月22日(金) 08:27
by バグ
scanf系の関数で例外が発生するミスで多そうなのは、引数にアドレスではなく、実体のコピーを指定していた…とかでしょうか?
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月22日(金) 10:01
by toyo
>sscanfを使う際の注意点
可変引数の関数ではプログラマ側がきっちり引数の型を管理しないと危険ですね
#include<stdio.h>
int main()
{
float f;
char *str="1.23";
sscanf(str, "%lf", &f);
printf("%f\n", f);
return 0;
}
これだけで軽く死ねます
Re:ハンドルされていない例外が発生しました
Posted: 2009年5月22日(金) 14:52
by TMS
解決しました!!
どうやらsscanfとsscanf_sの仕様の違い(?)を理解できていなかったようです
sscanf_s(buf,"room=%10s",room);
を
sscanf_s(buf,"room=%10s",room,sizeof(room));
と書き換えることでエラーなくプログラムが実行されました
ちなみにroomはchar配列です
皆様、丁寧な回答ありがとうございました
またこれはMSDNを見てそのまま引用したため、詳細は理解しておりません
よろしければ解説していただけるとうれしいです
龍神録の館 17章
Posted: 2009年6月07日(日) 14:51
by you
こんにちは、すみません、また詰まってしまいました。どなたかお助けください。
17章の自機にショットを撃たせてみようのところの
//ショット登録部
void enter_shot(){
//ショットボタンが押されていたら
if(CheckStatePad(configpad.shot)>0){
ch.shot_cnt++;
if(ch.shot_cnt%3==0){//3カウントに1回
の5、6行目にあるshot_cntのところで、chのメンバーでありませんというエラーがでてしまいます。
これは、struch.hのところのch_tのところでshot_cntを宣言しないといけないのでしょうか?
よろしくお願いします。
Re:龍神録の館 17章
Posted: 2009年6月07日(日) 15:18
by pooka
struct.hのキャラクターに関する構造体に
int shot_cnt;
を追加してください。
Re:龍神録の館 17章
Posted: 2009年6月07日(日) 18:13
by you
>>pookaさん
回答ありがとうございます。エラーはなくなり、実行できました^^
でも、ショットを撃つ音はするのですけど、弾の画像が表示されていません^^;
これは、graph.cppの方でなにか間違いがあるのでしょうか?
Re:龍神録の館 17章
Posted: 2009年6月07日(日) 18:37
by pooka
画像の読み込みはできていますか?
load.cppを見直してみてはどうでしょうか。(音が鳴るようなので大丈夫だとは思いますが…)
Re:龍神録の館 17章
Posted: 2009年6月07日(日) 18:37
by すずめ
こんにちは。
私もはじめは同じようなことがありましたが、
解説では、load.cppで
LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
となっていましたが、私のプロジェクトでは
LoadDivGraph( "dat/img/bullet/b0.png" , 5, 5, 1, 76, 75, img_bullet[0] ) ;
で無事に画像を表示できるようになりました。
どこが違うかというと
../dat/img/--------
dat/img/-------- です。
ただ、これは私の場合です。
Re:龍神録の館 17章
Posted: 2009年6月07日(日) 18:47
by you
>>pookaさん
回答ありがとうございます。ご指摘どおり、load.cppの方がおかしかったみたいです^^
>>すずめさん
回答ありがとうございます。僕の場合は逆みたいでした。
最初 : "dat/img/char/bl_00.png"
変更後 : "../dat/img/char/bl_00.png"
にすると画像が表示されました。
pookaさん、すずめさん、お二人とも本当にありがとうございました^^