トップページ > 記事閲覧
DXライブラリのバージョンを上げるとプログラムが動かなくなっ
名前:たま 日時: 2015/07/23 21:51

3.13d以前では動いていたプログラムが、3.13f以降動かなくなってしまいました。 //============================================================ #include <DxLib.h> #include <vector> #include <string> static std::vector<std::string> GetPathList(std::string folder){ std::vector<std::string> fileList; int hFind; FILEINFO fd; std::string s; s = folder; std::string::iterator itr = folder.end(); //フォルダ名が空 if(itr == folder.begin()){ s = ""; } else{ itr--; //フォルダ名の終わりに/が無ければ/(¥¥)追加 if(*itr != '/') s += '/'; } std::string _folder = s; s += "*"; // ファイル探索 hFind = FileRead_findFirst(s.c_str() , &fd); // 検索失敗 if(hFind == -1){ exit(1); } else{ // ファイル名をリストに格納するためのループ do{ //フォルダは再帰的に検索 if(fd.DirFlag){ char *file = fd.Name; std::string str = file; if(str != "." && str != ".."){ std::vector<std::string> infolder_list; infolder_list = GetPathList(_folder + str); for(std::vector<std::string>::iterator it = infolder_list.begin() ; it != infolder_list.end() ; it++){ std::string str = *it; fileList.push_back(str); } } } else{// ファイル //ファイル名をリストに格納 char *file = fd.Name; std::string str = _folder + file; fileList.push_back(str); } } while(FileRead_findNext(hFind , &fd) == 0); //次のファイルを探索 // hFindのクローズ FileRead_findClose(hFind); } return fileList; } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,LPSTR lpCmdLine , int nCmdShow){ ChangeWindowMode(1); if(DxLib_Init() == -1) return 0; std::vector<std::string> test = GetPathList("test/");//指定フォルダ内のファイル一覧を作成 for(int i = 0 ; i < test.size(); ++i) printfDx("%s\n" , test[i].c_str()); WaitKey(); return 1; } //============================================================ GetPathList関数を抜けるときに  Run-Time Check Failure #2 - Stack around the variable 'fd' was corrupted. というエラーが出ます。 自分のプログラムにどこかミスがあって今までたまたま動いていただけなのか、 ライブラリのバグなのか判断しかねるためどなたか原因が分かる方いらっしゃいましたらよろしくお願いします。
メンテ

Page: 1 |

Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.1 )
名前:管理人 日時:2015/07/23 23:11

手元の環境で載せていただいたプログラムを実行してみましたが、特に問題なく動作しました こちらのプログラムは指定したフォルダの構造次第で処理内容が変化すると思うのですが、 たまさんの環境ではどんなフォルダに対して GetPathList を呼んでも必ず Run-Time Check Failure #2 が 発生してしまうのでしょうか?
メンテ
Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.2 )
名前:たま 日時:2015/07/25 23:05

遅くなりました。 載せてあるコードの"test"フォルダはVisualStudioのプロジェクトと同じ階層においています。 中身は"a.txt" , "b.txt" , "c.txt" , "d.txt"の4つです。 Run-Time Check Failure #2 - Stack around the variable 'fd' was corrupted. が出た後に「継続」ボタンを押すと、一応メイン関数に帰ってきて正常にパス一覧が表示されます。 絶対パスでいろんなフォルダ名を与えても同じでした。
メンテ
Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.3 )
名前:管理人 日時:2015/07/26 02:41

ご返答ありがとうございます うーん、謎です・・・ Ver 3.13f 以降に不具合が発生したとのことですが、最新版でも同様の現象が発生するのでしょうか? もしよろしければこちらの暫定の最新版でも同様の現象が発生してしまうかお試しになってみてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) あと、よろしければお使いの Visual Studio のバージョンを教えてください ( Visual Studio Express 2013 for Windows Desktop 等 )
メンテ
Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.4 )
名前:たま 日時:2015/07/26 15:52

3.14dでも同じでした。 (全部3.10c、3.13dはOK、3.13f,3.14a,3.14dは動きません) 頂いた暫定最新版でも相変わらずです・・・。 Visual StudioはExpress 2013 for Windows DesktopのUpdate4です。 OSはWindows8.1の64bit版です。 if(fd.DirFlag)内のスコープを全部コメントアウトすると、正常に動作する場合とエラーになる場合があり、ますますわからない状態です。
メンテ
Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.5 )
名前:たま 日時:2015/07/26 15:57

補足です。 いろいろ削ったこのコードでもダメみたいです。 #include <DxLib.h> #include <vector> #include <string> std::vector<std::string> GetPathList(std::string folder){ std::vector<std::string> fileList; int hFind; FILEINFO fd; std::string s; s = folder; std::string::iterator itr = folder.end(); //フォルダ名が空 if(itr == folder.begin()){ s = ""; } else{ itr--; //フォルダ名の終わりに/が無ければ/(¥¥)追加 if(*itr != '/') s += '/'; } std::string _folder = s; s += "*"; // ファイル探索 hFind = FileRead_findFirst(s.c_str() , &fd); // 検索失敗 if(hFind == -1){ exit(1); } else{ do{ std::string a = "a"; } while(FileRead_findNext(hFind , &fd) == 0); //次のファイルを探索 // hFindのクローズ FileRead_findClose(hFind); } return fileList; } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,LPSTR lpCmdLine , int nCmdShow){ ChangeWindowMode(1); if(DxLib_Init() == -1) return 0; std::vector<std::string> test = GetPathList("test/");//指定フォルダ内のファイル一覧を作成 WaitKey(); return 1; } std::string a = "a"; の代わりに int a = 1; とするとエラーはなぜか出ないです。
メンテ
Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.6 )
名前:管理人 日時:2015/07/26 19:45

ご情報ありがとうございます Windows8.1 の 64bit版で Visual Studio Express 2013 for Windows Desktop Update 5 を使用して 貼り付けていただいたプログラムを実行したところ、私の環境でもエラーが発生しました 調べてみたところ Ver3.13e と Ver3.13f の間で行った文字列の扱いを変更した箇所で FileRead_findFirst や FileRead_findNext の戻り値がマイナスになる場合にメモリの不正なアクセスが 発生するようになっていました ( メモリの不正なアクセスはメモリの配置等の関係で完全には検出されないので Windows7 では Visual Studio のどのバージョンを使用しても検出されなかったのですが、 Windows8.1 と Visual Studio Express 2013 for Windows Desktop Update 5 という組み合わせでは検出されました ) エラーが発生しないように修正したバージョンをこちらにアップしましたので、 よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: DXライブラリのバージョンを上げるとプログラムが動かなくなっ ( No.7 )
名前:たま 日時:2015/07/26 21:36

管理人さま、迅速な対応をありがとうございます! 無事に動作するようになりました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存