- 締切済み
プログラムが止まってしまいます
Visual Studio 2012 c++ でプログラムを動かそうと思っているのですが、デバッグ開始すると画像のようなウィンドウが出て実行途中で止まってしまいます。 呼び出し履歴のint mqoLoadFileのソースを貼ります. int mqoLoadFile( MQO_OBJECT *mqoobj, char *filename, double scale, unsigned char alpha) { FILE *fp; MQO_OBJDATA obj[MAX_OBJECT]; MQO_MATDATA *M = NULL; char buf[SIZE_STR]; // 文字列読み込みバッファ char path_dir[SIZE_STR]; // ディレクトリのパス char path_tex[SIZE_STR]; // テクスチャファイルのパス char path_alp[SIZE_STR]; // アルファテクスチャファイルのパス int n_mat = 0; // マテリアル数 int n_obj = 0; // オブジェクト数 int i; // MaterialとObjectの読み込み fopen_s(&fp,filename,"rb"); if (fp==NULL) return 0; mqoobj->alpha = alpha; memset(obj,0,sizeof(obj)); i = 0; while ( !feof(fp) ) { fgets(buf,SIZE_STR,fp); // Material if (strstr(buf,"Material")) { sscanf_s(buf,"Material %d", &n_mat); M = (MQO_MATDATA*) calloc( n_mat, sizeof(MQO_MATDATA) ); mqoReadMaterial(fp,M); } // Object if (strstr(buf,"Object")) { sscanf_s(buf,"Object %s", obj[i].objname);//ココの実行中に止まる mqoReadObject(fp, &obj[i]); i++; } } n_obj = i; fclose(fp);
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
因みに。 sscanfを使うと「sscanf_sに直せ」とコンパイラに怒られる ↓ 単純にsscanfをsscanf_sに修正するだけで関数仕様を確認しない ↓ 訳判らんエラーで止まったり、マトモに読み込まないで文字が切れる ↓ 動かなくてドツボる と言うのは、C++のプログラマなら、必ず1度は通る道です。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
sscanf_sの「%s」と「%c」には、バッファのポインタに続いて、バッファサイズを指定しなければならない。 >sscanf_s(buf,"Material %d", &n_mat); はOKだが >sscanf_s(buf,"Object %s", obj[i].objname);//ココの実行中に止まる は「バッファサイズの指定がない」ので、サイズは「メモリ上のゴミ」つまりは「不定な値」が指定されたことになる。 sscanf_s(buf,"Object %s", obj[i].objname,_countof(obj[i].objname)); のように「バッファのポインタ」に続いて「バッファのサイズ」を「要素数」で指定しなければならない。 一部「バイト数」を返す「sizeof()マクロ」で説明しているサイトがあるが、ワイド文字版のswscanf_s()を使った時は「バイト数を指定したらバグる」ので、sizeof()を使うのは間違い。_countof()を使用する事。
- 8shi8
- ベストアンサー率32% (90/274)
エラーの画面が拡大できないのでエラー内容がわかりません ざっとコードを見た結果、メモリーを壊しそうなコードが存在します 変数bufをSIZE_STRで確保し、fgetsでSIZE_STR読み込みしています 読み込んだ1行のサイズがSIZE_STRを超えた場合SIZE_STR分読み込んだあとに0x00を追加します つまりfgetsでSIZE_STRを読み込むのであれば、bufのサイズはSIZE_STR+1を指定する必要があります