トップページ > 過去ログ > 記事閲覧
変数が勝手に初期化される…
名前:Yuno 日時: 2010/03/14 15:15

はじめまして このライブラリにはお世話になってます 以下のコードなんですが void DxAPath(char* path){ SetUseDXArchiveFlag(TRUE); SetDXArchiveExtension("dat"); SetDXArchiveKeyString(key); file_load.fsize = FileRead_size(path); if(file_load.fsize<=0){ FILE *fp=fopen("\\e_log.txt","wb"); fwrite(path,sizeof(char),strlen(path),fp); fclose(fp); DxLib_End(); } file_load.buf = (int *)malloc((file_load.fsize+1)*sizeof(int)); int fhandle = FileRead_open(path); FileRead_read(file_load.buf,file_load.fsize,fhandle); FileRead_close(fhandle); SetUseDXArchiveFlag(FALSE); } これで SetUseDXArchiveFlag(TRUE); SetDXArchiveExtension("dat"); SetDXArchiveKeyString(key); がないとDApathの引数のpathにちゃんと値が代入され ある場合は0x00000000となってしまいます これは仕様なのでしょうか? できれば使えるようにしたいのですが…

Page: 1 |

Re: 変数が勝手に初期化される… ( No.1 )
名前:Hiro & Sae 日時:2010/03/14 16:12

>DApathの引数のpathに DxAPath のことですかね? あと、このソースが何をしたいソースなのかを先に、書いて下さると、理解が早くなります。
Re: 変数が勝手に初期化される… ( No.2 )
名前:Yuno 日時:2010/03/14 16:25

あ、ほんとですねすみませんorz これは後でfile_load.buf,.fsizeに読み込んだ値を ほかの関数で参照してデータ操作(おもに暗号化,復号化)がすぐに出来るようにと作ったものです まぁ…単にdxaのファイルをロードしてメモリに読み込んでいるだけですね
Re: 変数が勝手に初期化される… ( No.3 )
名前:いっち 日時:2010/03/14 17:00

見たところ"DxAPath"の引数"path"に不正な値が入る要因は見受けられないのですが、 かといって"SetUseDXArchiveFlag"、"SetDXArchiveExtension"、"SetDXArchiveKeyString"が 原因であるとはちょっと思えません。 私の環境でも試してみたいので、事象の発生するコンパイル可能なソースの全文をご提供頂けますでしょうか? 余談ですが、エラー処理の"DxLib_End"の後にreturn文かthrowが必要だと思います。 それと、"malloc"で確保しているバッファの量が若干多いのは意図通りなのでしょうか?
Re: 変数が勝手に初期化される… ( No.4 )
名前:Yuno 日時:2010/03/14 18:38

わかりました では少しお待ちください〜 何しろ量が多いのでいったんまとめますね それとmallocはcharの\0のための分… …あれ?charじゃなくてintだ ありがとうございますそこもちょこっと直してアップします
Re: 変数が勝手に初期化される… ( No.5 )
名前:けいし 日時:2010/03/14 18:50

アトリエミュート開発担当、けいしと申します。 ポインタの値が意図せず0x00000000になってしまう場合、 大抵は他の配列等のバッファオーバーラン(領域外アクセス)によるものです(経験上)。 例えば、 int i = 0; int a[3]; int* p = &i; のようなコードがあり、ポインタpが正常な値を指しているとしましょう。 しかし、ここで a[3] = 0; // aはa[0]〜a[2]までが領域なので、領域外アクセス としてしまうと、なんとpが0x00000000となってしまうのです! 恐らく今回の問題もこれと同様かと思いますので、 ポインタ周りを見直す必要があるかもしれません。 この場合、デバッグはかなり大変になりますから、 VisualStudioであれば、ステップ実行等を駆使することを おすすめします。 ※ソースを全部見て判断したわけではないので、 もし原因が別でしたら、誠に申し訳ありません。
Re: 変数が勝手に初期化される… ( No.6 )
名前:Yuno 日時:2010/03/15 00:15

参考になります 今回の件は 見ての通り関数の引数をポインタとして宣言しているのですが この場合も領域外アクセスはありうるのでしょうか? GV.hでGLOBAL void DxAPath(char *path); と宣言して 使用はDxAPath("不特定多数の文字"); となっているのです これはどうでしょうか?
Re: 変数が勝手に初期化される… ( No.7 )
名前:いっち 日時:2010/03/14 22:04

関数の宣言や使い方には特に問題ないと思います。 けいしさんと同じく私もスタックの破壊を疑っているのですが、 ソースを見てみないことにはなんとも言えません。 ("SetUseDXArchiveFlag"、"SetDXArchiveExtension"、"SetDXArchiveKeyString"が原因である可能性もあります) ※追記 問題ないですが、引数にconst属性をつけて欲しいです。 GLOBAL void DAPath(char *path); ↓↓↓ GLOBAL void DAPath(const char *path);
Re: 変数が勝手に初期化される… ( No.8 )
名前:けいし 日時:2010/03/15 18:20

少し稀な例ですが、VisualStudioの場合、 編集中のソースを別の環境でコンパイルした場合ときに 想定外のバイナリを吐くことがあります(中間コード等が原因かも)。 この場合、プログラムが正常にもかかわらず、 領域外アクセスするようなコードを出力することがありますので、 念のため、「リビルド」をしてみて下さい。 (過去何度かこれで悩みました) また、「リリース」でコンパイルした実行ファイルに対しては、 ステップ実行したときに変数の値が正しく表示されないことがあります(最適化の関係かも)。 この場合、実際にポインタが0x00000000を指しているのかも怪しくなりますので、 ステップ実行はデバッグモードを推奨します。 -- まあ、いずれにせよ他のソースも含めて判断する必要が あるかもしれませんね><
Re: 変数が勝手に初期化される… ( No.9 )
名前:Yuno 日時:2010/03/15 19:06

></ そうなんですか 確かにそれが起きる直前にXPでコンパイルしていたのを 7でコンパイルしてそこからおかしくなったという記憶がありますorz ただ、リビルドをしてみてもプログラムがうんともすんとも言わないんですよね…
Re: 変数が勝手に初期化される… ( No.10 )
名前:いっち 日時:2010/03/15 21:20

別のスレッドを作成されたようですが、 私も気になるので良ければご返答下さい。 以下のテストソースでも事象は発生しますでしょうか? 私の環境ではyunoさんのおっしゃるような事象は見受けられませんでした。 私の主な環境は以下の通りです。 Win XP Pro SP3 + DxLib 3.01 + VS2008EE テストに使用したデータは以下のURLからダウンロードできます。 > ttp://www1.axfc.net/uploader/Sc/so/92754.zip //-- テストソース --// // アーカイブファイル"Image.dat"内の"test1.bmp"を使用 #include "DxLib.h" struct { int fsize; void* buf; } file_load; const char* key = "crypt"; const char* BMP_FILE = "Image\\test1.bmp"; void DxAPath( const char *path ) { SetUseDXArchiveFlag( TRUE ); SetDXArchiveExtension( "dat" ); SetDXArchiveKeyString( key ); file_load.fsize = FileRead_size( path ); file_load.buf = malloc( file_load.fsize ); int fhandle = FileRead_open( path ); FileRead_read( file_load.buf, file_load.fsize, fhandle ); FileRead_close( fhandle ); SetUseDXArchiveFlag( FALSE ); return; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); DxAPath( BMP_FILE ); int gh = CreateGraphFromMem( file_load.buf, file_load.fsize ); free( file_load.buf ); file_load.fsize = 0; while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawGraph( 0, 0, gh, FALSE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 変数が勝手に初期化される… ( No.11 )
名前:管理人 日時:2010/03/15 23:55

Yuno さんすいません、同じ内容のスレッドが複数あると混乱するので削除させていただきました 関数の引数を初期化するという仕様はありません 私といっちさん、けいしさんでご返答し合うと混乱の元ですので、いっちさん、けいしさんにご返答をお任せします
Re: 変数が勝手に初期化される… ( No.12 )
名前:Yuno 日時:2010/03/16 00:04

では私の環境のみで起こるということですか… 〉管理人さん どうもすいません 返答ありがとうございます いったいどうすれば…
Re: 変数が勝手に初期化される… ( No.13 )
名前:管理人 日時:2010/03/16 00:17

とりあえず No.10 のいっちさんのご返答にありますプログラムを試されてみては如何でしょうか?
Re: 変数が勝手に初期化される… ( No.14 )
名前:Yuno 日時:2010/03/16 01:37

orzいっちさんのサンプルを実行しようとしたらなぜか LIBCMTD.lib(dbgheap.obj) : error LNK2005: _malloc は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dbgheap.obj) : error LNK2005: _calloc は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dbgheap.obj) : error LNK2005: _realloc は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 LIBCMTD.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dosmap.obj) : error LNK2005: __errno は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(trnsctrl.obj) : error LNK2005: ___CxxFrameHandler は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(vsprintf.obj) : error LNK2005: _vsprintf は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(dbgrptw.obj) : error LNK2005: __CrtDbgReportW は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(ismbbyte.obj) : error LNK2005: __ismbblead は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(typinfo.obj) : error LNK2005: "public: void __thiscall type_info::_type_info_dtor_internal_method(void)" (?_type_info_dtor_internal_method@type_info@@QAEXXZ) は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LIBCMTD.lib(typinfo.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。 LIBCMTD.lib(typinfo.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。 LIBCMTD.lib(getenv.obj) : error LNK2005: _getenv は既に MSVCRTD.lib(MSVCR80D.dll) で定義されています。 LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。 と大量のエラーが 何度やってもダメ… VCに原因があるのでしょうか? ちゃんとライブラリは配置したのに (長文失礼しました)
Re: 変数が勝手に初期化される… ( No.15 )
名前:いっち 日時:2010/03/16 02:31

プロジェクトを新規作成なさったのだと思いますが、 プロジェクトのプロパティで「ランタイム ライブラリ」設定がうまくいっていないものと思われます。 以下のページで設定を再度確認なさってみてください。 > ttp://homepage2.nifty.com/natupaji/DxLib/dxuse.html 以下のスレッドが参考になると思います。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=811
Re: 変数が勝手に初期化される… ( No.16 )
名前:Yuno 日時:2010/03/16 13:54

すいませんできました… なんででしょうか? 一度最初っから打ってみてどうなるか試してみようと思います

Page: 1 |