1

openGL の初心者向けチュートリアルに従って、.OBJ ファイルの独自のローダーを書き終えました。書き込みの後、通常はコンパイルのプロセスが続きますが、これは C++ では面倒でうんざりすることです。メソッドの 1 つで未処理の例外が発生しました。コードは次のとおりです。

float* Loader::LoadObj(const char* filePath){
//Declaration of v, vt and vn temporary container buffers for parsing
vector<glm::vec3> vertcies;
vector<glm::vec2> uvs;
vector<glm::vec3> normals;
vector<fvert> facevertcies;

//open the file
FILE* objFile;
fopen_s(&objFile, filePath,"r");
if( objFile == NULL )
{
    printf("Impossible to open the file ! Are you in the right path ?\n");
}

            char line[128]; // where to store the first string read from each line

            //other containers
            glm::vec3 vertex;
            glm::vec2 uv;
            glm::vec3 normal;
            fvert fv1,fv2,fv3;

            // for each line in the obj file
            while(true)
            {

                // read the first word of the line
                int lineId = fscanf_s(objFile,"%s",line);                   
                        if (lineId == EOF)  
                            break;
                // parse line by line
                if ( strcmp( line, "v" ) == 0 )
                {
                        fscanf_s(objFile, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z);
                        vertcies.push_back(vertex);                             
                }
                else if ( strcmp( line, "vt" ) == 0 )
                {       
                        fscanf_s(objFile, "%f %f\n", &uv.x, &uv.y);
                        uvs.push_back(uv);                          
                }
                else if ( strcmp( line, "vn" ) == 0 )
                {
                        fscanf_s(objFile,"%f %f %f\n", &normal.x, &normal.y, &normal.z );
                        normals.push_back(normal);
                }... //method continues}}

コードは完全ではありませんが、他の部分は無関係です。LoadObj(char*) メソッドは obj ファイルを開こうとし、解析のためにファイルのすべての行を反復する while ループに入ります。ブレークポイントを使用すると、ループ内の fscanf_s の最初の呼び出しで「スタック バッファ オーバーラン」例外が発生することがわかりました (ファイルは正常に開きます)。空のtry catchでキャッチしようとしましたが、失敗しました。

誰かが、この例外の原因を理解し、解決策で答えを補完するのを手伝ってくれませんか。これはこのフォーラムでの私の最初の投稿です。ここでルールを破っていないことを願っています。初心者を助けてください。これが CallStack です。

    XXX.exe!__report_gsfailure(unsigned __int64 StackCookie) Line 147   C
XXX.exe!__GSHandlerCheckCommon(void * EstablisherFrame, _DISPATCHER_CONTEXT * DispatcherContext, _GS_HANDLER_DATA * GSHandlerData) Line 189 C
XXX.exe!__GSHandlerCheck_EH(_EXCEPTION_RECORD * ExceptionRecord, void * EstablisherFrame, _CONTEXT * ContextRecord, _DISPATCHER_CONTEXT * DispatcherContext) Line 96    C
ntdll.dll!000007fc400f9f4d()    Unknown
ntdll.dll!000007fc400fb220()    Unknown
ntdll.dll!000007fc400e4bba()    Unknown
msvcr110d.dll!memset() Line 161 Unknown
msvcr110d.dll!_input_s_l(_iobuf * stream, const unsigned char * format, localeinfo_struct * plocinfo, char * arglist) Line 939  C++
msvcr110d.dll!vfscanf(int (_iobuf *, const unsigned char *, localeinfo_struct *, char *) * inputfn, _iobuf * stream, const char * format, localeinfo_struct * plocinfo, char * arglist) Line 62 C
msvcr110d.dll!fscanf_s(_iobuf * stream, const char * format, ...) Line 132  C

おまけの質問: http://blog.markloiseau.com/2012/02/two-safer-alternatives-to-scanf/ で、固定の char 配列の代わりに char* を使用して %ms を渡すことでコードを改善できることもここで読みましたストレージ用にメモリを動的に割り当てる fscanf に。誰かが私のコードに実装する方法を教えてもらえますか? いまいましいオリジナルを実行することさえできないという事実にもかかわらず、可能性は魅力的です. 助けてくれる人に感謝します。

4

1 に答える 1