先日、SDLマルチメディアライブラリを使用して小さなC ++プログラミングをコーディングしようとしていたところ、この小さな問題に遭遇し、最終的に試行錯誤で解決しました。問題は、私が問題を解決するために何をしたかは理解しているが、問題の性質は本当に理解していないということです。
問題は、SDLでのキーボードイベント処理にありました。プログラムを終了するための1回のキー押下を処理するコードは単純明快です。[eventQueueはSDL_Event構造体です]
//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{
//note: uses the boolean logical '==' equals operator..
if ( eventQueue.key.keysym.sym == SDLK_ESCAPE )
{
running = false;
}
}
上記のコードでは、ESCAPEキーを単独で押すだけでメインループが終了し、プログラムがクリーンアップされて閉じます...
ただし...修飾キー(shift / alt / ctrl)を使用するキー押下を処理するために必要なコードは、「==」演算子では正しく機能しませんでした。等式(論理?)演算子の代わりにビット単位のAND演算子を使用する必要があることを知るのに何年もかかりました。
//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{
//note: requires the use of the bitwise AND operator..
if (( eventQueue.key.keysym.mod & KMOD_ALT ) && (eventQueue.key.keysym.sym == SDLK_F4 ))
{
running = false;
}
}
ここでの私の混乱は、「keysym.sym」メンバーを使用する場合は論理演算子「==」が正常に機能するが、「keysym.mod」メンバーを使用する場合は「&」を使用する必要があるという事実に起因します。ビットごとのAND演算子。
さて、推測しなければならないのは、「keysym.sym」がキーボードの単一のキーを表す単一の数値を処理するだけでよいのに対し、「keysym.mod」はShiftキー、Ctrlキー、Altキーのさまざまな組み合わせを処理するには...?
私の質問を要約すると、なぜこれが当てはまるのですか?試行錯誤以外に、特定のデータをビット演算子または論理/等式演算子と比較する必要があるかどうかを知る方法はありますか?「keysym.sym==SDLK_F4」は正常に機能するのに、「keysym.mod == KMOD_ALT」は機能しないのはなぜですか?10進数を含む演算が、ビット値を比較する演算とは異なる結果になるのはなぜですか?論理演算が機能し、ビット演算が機能しない状況もありますか?