ハンドルされていない例外が発生しました

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TMS

ハンドルされていない例外が発生しました

#1

投稿記事 by TMS » 16年前

はじめまして

自分はこちらのサイトを参考に現在ゲームを作ろうとしている者です
今回、原因のわからないエラーに出くわしてしまい、質問させていただきました

エラーはファイルの読み込み関係で起きています

コンパイルはエラーなく通過するのですが
実行中、以下の関数で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;
}
不鮮明なところがありましたらすみません
何とぞお願いします

TMS

Re:ハンドルされていない例外が発生しました

#2

投稿記事 by TMS » 16年前

すみません環境を書き忘れてしまいました

WindowsVista、C言語、MS VisualStadio2008

です

よろしくお願いします

kazuoni

Re:ハンドルされていない例外が発生しました

#3

投稿記事 by kazuoni » 16年前

えっと、考えられるのは、
・FileNameに終端文字が格納されていない
・関数を抜けるときにfcloseをしていない

ですかね。

Mist

Re:ハンドルされていない例外が発生しました

#4

投稿記事 by Mist » 16年前

fopen_sを使用する場合は、ファイルオープン出来たかどうかはfopen_sの戻り値でチェックしてください。
MSDN読みましたけどfopen_sはファイルオープン失敗時にfpにNULLはセットしてくれないみたいです。
if (fopen_s(&fp,FileName,"r")) {
    return -1;
}

Mist

Re:ハンドルされていない例外が発生しました

#5

投稿記事 by Mist » 16年前

追加

失敗時には「fpの内容を変更しない」とあるのでfpにあらかじめNULLをセットするのもいいかもしれません。

TMS

Re:ハンドルされていない例外が発生しました

#6

投稿記事 by TMS » 16年前

早々の回答ありがとうございます

ですが
>fopen_sの戻り値でチェック
>fpにあらかじめNULLをセット
>関数を抜けるときにfclose

どれもやってみたのですが、結果は変わりませんでした

ただ一つ、自分が無学なもので
>FileNameに終端文字が格納されていない
をどのようにすればよいのかわかりませんでした

ご迷惑かけてすみませんが、どうぞご教授お願いします

MNS

Re:ハンドルされていない例外が発生しました

#7

投稿記事 by MNS » 16年前

全然関係ないかもしれませんが、
"Map/MapData000.txt"
これを
"Map\\MapData000.txt"
このように書き換えてみてください。

Mist

Re:ハンドルされていない例外が発生しました

#8

投稿記事 by Mist » 16年前

関数をコールする時に

LoadMap("Map/MapData000.txt");

というようにしているということですよね。
であれば、終端コードは問題ないと思います。

少なくとも提示されているソースだけでは例外を発生させるような原因は見つけられませんが、ステップ実行をしたときにどこで例外が発生するのでしょうか?
fopen_sですか?
それとも提示されていない部分ですか?

もう少し情報がないと回答できそうにないです。

TMS

Re:ハンドルされていない例外が発生しました

#9

投稿記事 by TMS » 16年前

すみませんでした

ここに投稿させていただく前に、ブレークポイントを使って自分なりにエラーの位置を判断したつもりだったんですが
Mistさんの回答から、ステップ実行で確認してみたところ
エラーは上記のソース部分ではなかったことがわかりました

素人の勘違いで皆様に無駄な時間をとらせてしまい本当にすみませんでした


また、エラーはsscanf関数部分で起きていました

自分自身としてsscanfは使い方を完全に理解できていない部分だったので
もしよろしければ、詳しい使い方等ご教授お願いします

エラーに関してはできる限り自分で解決したいので、sscanfを使う際の注意点などをお教えいただけるとうれしいです

バグ

Re:ハンドルされていない例外が発生しました

#10

投稿記事 by バグ » 16年前

scanf系の関数で例外が発生するミスで多そうなのは、引数にアドレスではなく、実体のコピーを指定していた…とかでしょうか?

toyo

Re:ハンドルされていない例外が発生しました

#11

投稿記事 by toyo » 16年前

>sscanfを使う際の注意点
可変引数の関数ではプログラマ側がきっちり引数の型を管理しないと危険ですね
#include<stdio.h>
int main()
{
	float f;
	char *str="1.23";
	sscanf(str, "%lf", &f);
	printf("%f\n", f);
	return 0;
}
これだけで軽く死ねます

TMS

Re:ハンドルされていない例外が発生しました

#12

投稿記事 by TMS » 16年前

解決しました!!

どうやらsscanfとsscanf_sの仕様の違い(?)を理解できていなかったようです

sscanf_s(buf,"room=%10s",room);

sscanf_s(buf,"room=%10s",room,sizeof(room));
と書き換えることでエラーなくプログラムが実行されました

ちなみにroomはchar配列です

皆様、丁寧な回答ありがとうございました

またこれはMSDNを見てそのまま引用したため、詳細は理解しておりません
よろしければ解説していただけるとうれしいです

you

龍神録の館 17章

#13

投稿記事 by you » 16年前

 こんにちは、すみません、また詰まってしまいました。どなたかお助けください。

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を宣言しないといけないのでしょうか?

よろしくお願いします。

pooka

Re:龍神録の館 17章

#14

投稿記事 by pooka » 16年前

struct.hのキャラクターに関する構造体に
int shot_cnt;
を追加してください。

you

Re:龍神録の館 17章

#15

投稿記事 by you » 16年前

>>pookaさん
回答ありがとうございます。エラーはなくなり、実行できました^^

でも、ショットを撃つ音はするのですけど、弾の画像が表示されていません^^;

これは、graph.cppの方でなにか間違いがあるのでしょうか?

pooka

Re:龍神録の館 17章

#16

投稿記事 by pooka » 16年前

画像の読み込みはできていますか?
load.cppを見直してみてはどうでしょうか。(音が鳴るようなので大丈夫だとは思いますが…)

すずめ

Re:龍神録の館 17章

#17

投稿記事 by すずめ » 16年前

こんにちは。
私もはじめは同じようなことがありましたが、
解説では、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/-------- です。

ただ、これは私の場合です。

you

Re:龍神録の館 17章

#18

投稿記事 by you » 16年前

>>pookaさん
回答ありがとうございます。ご指摘どおり、load.cppの方がおかしかったみたいです^^

>>すずめさん
回答ありがとうございます。僕の場合は逆みたいでした。

最初 : "dat/img/char/bl_00.png"
変更後 : "../dat/img/char/bl_00.png"

にすると画像が表示されました。

pookaさん、すずめさん、お二人とも本当にありがとうございました^^

閉鎖

“C言語何でも質問掲示板” へ戻る