1

我创建了一个名为 panel 的结构,它在 OpenGL 中渲染,工作正常,但我想将它添加到面板:

int flags;

然后我在标题中定义它:

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

像这样使用标志值:

panel.flags = PANEL_TITLE | PANEL_MOVEABLE;

而不是很多:(看起来不太好)

bool panel_has_title;
bool panel_moveable;
bool panel_shadow;

然后检查 bool 值,而不是我可以只使用单个 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

修改后的问题中的所有三个变体也是如此。

没有建议的答案可以解释这些主张。虽然拥有 PANEL_SHADOW 0x0003 不一定是正确的,但它不一定是错误的。但是,在这些情况下,通常只需声明:

#define PANEL_SHADOW (PANEL_TITLE | PANEL_MOVEABLE)

...表明这确实是目的。

您的“面板”是否以某种方式映射到易失性存储器?
函数会改变它吗?
你有没有#defined 0x0002 意味着完全不同的东西?

于 2012-10-17T15:28:11.230 回答