トップページ > 過去ログ > 記事閲覧
MakeKeyInputの挙動がおかしい?
名前:taru49 日時: 2012/02/29 17:26

MakeKeyInputを使い入力を受け取っているのですが、 文字の間に文字を挿入するとおかしな挙動をします。 具体的には aa と入力後 ← b と入力して aba にしようとすると、 abaa になり最後の1文字は修正できなくなってしまいます。 またカーソルを移動して Delete Backspace を使用すると 文字が2文字消えたり、全く消えないということが発生しました。 おそらく不具合だと思うのですが、修正お願いできないでしょうか。 環境はwindows7 MinGW(g++ 4.6.1) DXライブラリver3.07aです。 以下のコードで確認しました。 #include <DxLib.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ) { return -1; } SetDrawScreen( DX_SCREEN_BACK ); int keyInput = MakeKeyInput( 255, TRUE, FALSE, FALSE ); SetActiveKeyInput( keyInput ); do { ClearDrawScreen(); DrawKeyInputString( 10, 10, keyInput ); ScreenFlip(); } while( CheckKeyInput( keyInput ) == 0 && ProcessMessage() == 0 ); char s[256]; GetKeyInputString( s, keyInput ); DrawString( 10, 40, s, GetColor( 255,255,255 ) ); DeleteKeyInput( keyInput ); ScreenFlip(); WaitKey(); DxLib_End(); return 0 ; } よろしくお願いします。

Page: 1 |

Re: MakeKeyInputの挙動がおかしい? ( No.1 )
名前:いっち 日時:2012/03/02 20:32

私の環境(WinXP、G++4.5.2、DxLib3.07a)でも再現しました。 ただし、VS2008環境では発生しないようでした。
Re: MakeKeyInputの挙動がおかしい? ( No.2 )
名前:管理人 日時:2012/03/04 20:46

掲載していただいたプログラムで手元の環境でも同様の現象が発生しました 修正版をアップしましたので、よろしければお使いください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) このバグはGCC版でのみ発生する現象でした GCC版ではインラインアセンブラを使用していないのですが、文字列の挿入の際に使用していた 自前のメモリ内容移動関数の非インラインアセンブラ版にバグがあり、これが今回の 不具合の原因になっていました orz
Re: MakeKeyInputの挙動がおかしい? ( No.3 )
名前:taru49 日時:2012/03/04 23:51

修正ありがとうございます。 早速確認してみたのですが、libDxUseCLib.aでundefined referenceが表示されリンクできませんでした。 御手数おかけしますが、確認して頂けないでしょうか?
Re: MakeKeyInputの挙動がおかしい? ( No.4 )
名前:管理人 日時:2012/03/05 02:41

すみません、誤って DevCpp 内の GCC でコンパイルした a ファイルをアップしてしまっていました m(_ _;m 正しくコンパイルしなおしたファイルをアップしましたので、申し訳ありませんがもう一度ダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 あと、今回リンクする a ファイルが増えたのでした コンパイル時のオプションの -lDxLib -lDxUseCLib の部分に -lDxDrawFunc を追加して -lDxLib -lDxDrawFunc -lDxUseCLib としてください
Re: MakeKeyInputの挙動がおかしい? ( No.5 )
名前:taru49 日時:2012/03/05 20:39

対応ありがとうございます。 修正されていることを確認しました。 しかし稀にDxLib_Initで動作が停止するようになってしまいました。 停止時Windowsログ上では 障害が発生しているモジュール名: ntdll.dll 例外コード: 0xc0000374 が記録されていました。 またLog.txtは 1068:フォントの初期化を行います 1069:フォントの初期化は正常に終了しました までが出力されていました。 何度も申し訳ないのですが、確認してみていただけないでしょうか? よろしくお願いします。
Re: MakeKeyInputの挙動がおかしい? ( No.6 )
名前:管理人 日時:2012/03/07 02:27

二つほどご質問させてください 1.稀にとのことですが頻度としては何回に一回くらいでしょうか? 2.動作が停止するプログラムはスレッドのトップに掲載されたプログラムでしょうか?
Re: MakeKeyInputの挙動がおかしい? ( No.7 )
名前:taru49 日時:2012/03/07 07:31

1.8〜13回に1回くらいです。 2.そうです。 スレッドトップのプログラムで動作が停止する回数を数えてみたところ、100回中14回でした。 また3.07aでは100回中0回で、一度も表示されませんでした。
Re: MakeKeyInputの挙動がおかしい? ( No.8 )
名前:管理人 日時:2012/03/09 04:07

ご返答ありがとうございます Win7 64bit の環境と WinXP の環境でそれぞれ50回ずつ起動してみましたが 停止することはありませんでした 3.07a では大丈夫だったとのことですので最終手段がまだありますが、 その前によろしければ私の環境で計100回のテストでも停止しなかった 実行ファイルをtaru49さんの環境でも正常に動作するか試してみていただけないでしょうか? m(_ _)m https://dxlib.xsrv.jp/file/MakeKeyInputTest.zip 中に実行ファイルだけ入っています コンパイルしたプログラムは taru49さんが最初に載せて頂いたプログラムそのままです
Re: MakeKeyInputの挙動がおかしい? ( No.9 )
名前:taru49 日時:2012/03/09 22:44

試してみました。 結果、100回中6回動作が停止しました。 どうもIMEが原因で発生しているような感じです。Microsoft Office IME 2010だと100回中6回停止しましたが、 Microsoft IMEに切り替えると100回中一度も停止しませんでした。
Re: MakeKeyInputの挙動がおかしい? ( No.10 )
名前:sy(サイ) 日時:2012/03/10 11:50

3.07aで正常に動作していましたが、上記のソースコードに変えたら、MakeARGB8ColorSoftImage関数の場所で 0x0018e1f0 で初回の例外が発生しました: 0xC0000005: Access violationと出て止まるようになりました。
Re: MakeKeyInputの挙動がおかしい? ( No.11 )
名前:管理人 日時:2012/03/11 03:04

Microsoft Office IME 2010 をインストールして試してみたところ、 数十回に1回の割合で私の環境でも動作が停止するようになりました! 原因を調べたところ、メモリの再確保を行う際に( reallocのような関数を使用する際に )、 「再確保するメモリ領域のサイズが元のサイズよりも小さい場合は、確保メモリの領域は変化しない」 ということを前提に組んだプログラムが原因でメモリの不正なアクセスが発生してしまっていました 元の確保メモリ領域より更に大きなサイズのメモリ領域を確保しようとした際は、 すぐ後のメモリ領域も使用中の場合は、同じメモリ領域には収まらなくなり 確保先のメモリ領域が変化する、というのは直感的にわかるので その直感的な感覚で 「ならば確保するメモリ領域が元より小さくなる場合は使用するメモリ領域が変化することは無いだろう」 と、仕様の何処にも書かれていないことを思い込んでそれに沿ったプログラムを組んでしまっていました orz 修正版をアップしましたので、よろしければお試しになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) > sy(サイ)さん お試し頂きありがとうございます
Re: MakeKeyInputの挙動がおかしい? ( No.12 )
名前:taru49 日時:2012/03/11 20:04

修正ありがとうございます。 修正版MinGW用を試してみたのですがlibDxUseCLib.aでundefined referenceが表示されリンクできませんでした。 Dev-C++用になっている(?)ようです。 正直なところ、IMEを変えただけでアプリケーションエラーが出たり出なくなったりするとは思えず 結果は出たものの半信半疑だったのですが… PCは不思議ですね。
Re: MakeKeyInputの挙動がおかしい? ( No.13 )
名前:管理人 日時:2012/03/11 21:20

すみません、ご指摘の通り Dev-C++ の a ファイルになっていました・・・ orz ( UseCLib 以外の Dx と付いたファイル全部でした ) 何度もお手数で申し訳ありませんが、よろしければお試しください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 > 正直なところ、IMEを変えただけでアプリケーションエラーが出たり出なくなったりするとは思えず > 結果は出たものの半信半疑だったのですが… > PCは不思議ですね。 確かにそうですね・・・ IME2010にはOSのメモリ管理に関係するアップデートも含まれていたのか・・・とか、 適当な推測くらいしか思いつきません (・・;
Re: MakeKeyInputの挙動がおかしい? ( No.14 )
名前:taru49(解決) 日時:2012/03/12 07:33

無事リンクが通り、落ちなくなっていることを確認しました。 丁寧な対応、ありがとうございました。

Page: 1 |