1

OpenGL でレンダリングする panel という構造を作成しましたが、正常に動作しますが、これを panel に追加したいと思います:

int flags;

次に、ヘッダーでこれを定義します:

#define PANEL_TITLE    0x0001
#define PANEL_MOVEABLE 0x0002
#define PANEL_SHADOW   0x0003

次のように flags 値を使用するには:

panel.flags = PANEL_TITLE | PANEL_MOVEABLE;

たくさんあるのではなく:(これは良くありません)

bool panel_has_title;
bool panel_moveable;
bool panel_shadow;

次に、ブール値を確認します。代わりに、単一の int を使用して同じ結果を得ることができます。上記のコードのように、フラグを使用する多くのオープンソースのものを読みました。ただし、フラグを次のようにチェックすると、機能しないという問題があります。

panel.flags = PANEL_TITLE | PANEL_MOVEABLE;
if(panel.flags & PANEL_TITLE) //this one works
{

}
if(panel.flags & PANEL_MOVEABLE) //this one doesn't work
{
  //not gets called
}

編集:わかりました、今私はそれをに変更しました

#define PANEL_TITLE    0x0002
#define PANEL_MOVEABLE 0x0004
#define PANEL_SHADOW   0x0008

彼らは再び互いに交差していますか?新しい問題は、私が設定した場合です

panel.flags = PANEL_TITLE;

その後、その中のすべての関数が呼び出されます

if(panel.flags & PANEL_TITLE)  
{
  //called which is normal
}
if(panel.flags & PANEL_MOVEABLE)  
{
  //called ..
}
if(panel.flags & PANEL_SHADOW)  
{
  //called ..
}

それは正常ですか?

4

3 に答える 3

4

ここでの問題は、ビットマスクが互いに交差することです。例 (8 ビット用に簡略化)

#define PANEL_TITLE    0x0001 // 0b00000001
#define PANEL_MOVEABLE 0x0002 // 0b00000010
#define PANEL_SHADOW   0x0003 // 0b00000011

あなたが欲しいのはこれです:

#define PANEL_TITLE    0x0001 // 0b00000001
#define PANEL_MOVEABLE 0x0002 // 0b00000010
#define PANEL_SHADOW   0x0004 // 0b00000100

あなたの編集に編集:

そのように設定するのではなく、次のように設定します。

panel.flags |= PANEL_TITLE;

最後の問題については、一目見ただけでは何も問題がありません。デバッガーでステップオーバーして変数を出力してみてください。これにより、問題をより明確に把握できます。

于 2012-10-17T13:11:24.723 に答える
1
#define PANEL_TITLE    0x0001
#define PANEL_MOVEABLE 0x0002
#define PANEL_SHADOW   0x0003

フラグを定義するとき、それらは交差してはなりません。あなたの定義で

PANEL_SHADOW == PANEL_MOVEABLE | PANEL_TITLE

本当です。意味はありますか? むしろ、次のように別のビットを使用します

#define PANEL_SHADOW   0x0004

の値を出力しpanel.flags & XXXます。0 とは異なる必要があります。エラーはおそらく別の場所にあります (変更しpanel.flagsますか?)

于 2012-10-17T12:58:52.067 に答える
0

いいえ、それは正常ではありません。それは超自然的です(冗談です...)

$ cat >pan.c && gcc pan.c && ./a.exe
#define PANEL_TITLE    0x0002
#define PANEL_MOVEABLE 0x0004
#define PANEL_SHADOW   0x0008
struct {int flags;} panel;
int main(){
  panel.flags = PANEL_TITLE | PANEL_MOVEABLE;
  if (panel.flags & PANEL_TITLE) printf("Hep\n");
  if (panel.flags & PANEL_MOVEABLE) printf("Hop\n");
  if (panel.flags & PANEL_SHADOW) printf("Hip\n");
}

期待どおりに出力されます。ヒップじゃない。

Hep
Hop

変更された質問の 3 つのバリエーションすべてと同様です。

主張を説明する提案された答えはありません。PANEL_SHADOW 0x0003 を持つことが必ずしも正しいとは限りませんが、必ずしも間違っているわけではありません。ただし、これらの場合、通常は次のように宣言します。

#define PANEL_SHADOW (PANEL_TITLE | PANEL_MOVEABLE)

...これが実際の目的であることを示します。

あなたの「パネル」は、何らかの形で揮発性メモリにマップされていますか?
関数はそれを変更しますか?
0x0002 を #define して、まったく別のものを意味しましたか?

于 2012-10-17T15:28:11.230 に答える