C++: strcmp being ignored
C++: strcmp being ignored
我正在尝试编写一些代码来检测某个图像并播放声音。在我的源中,我使用 ImageGetName 来获取图像本身的名称。
ImageGetName 如下所示:
const char *ImageGetName(const image_c *image)
{
const image_c *rim;
rim = (const image_c *) image;
return rim->name;
}
在我的主函数中,我定义了这个:
const char *image = ImageGetName(mo->subsector->sector->floor.image);
它应该在调用时将 *image 指向 floor.image,并根据需要对它们进行排序。
现在,我想做的是访问当前图像名称
ImageGetName(mo->subsector->sector->floor.image).
所以要做到这一点,我假设我必须使用 strcmp。但也许我做得不正确。有问题的块:
if (mo->player && gravity > 0 && -zmove > OOF_SPEED && ! fly_or_swim)
{
if(!strcmp(image, "WATER")) //false, do no lookup
{
CON_Message("Normal Floor!");
mo->player->deltaviewheight = zmove / 8.0f;
S_StartFX(mo->info->oof_sound, P_MobjGetSfxCategory(mo), mo);
}
else if(strcmp(image, "WATER") == 0) //true, look this up!!
CON_Message("Detected WATER FLAT!");
mo->player->deltaviewheight = zmove / 10.0f;
S_StartFX(mo->info->secretsound, P_MobjGetSfxCategory(mo), mo);
}
所以这里的问题是它完全忽略了第一个strcmp if(!strcmp(image, "WATER"((,而直接转到第二个:else if(strcmp(image, "WATER"( == 0(。它不应该这样做。在大多数情况下,除非玩家实际踩到WATER图像,否则它应该评估第一部分为真实。
问题是玩家实际上并没有踩到标有"WATER"的图像,而是玩家踩到的每个图像都会产生第二个输出(检测到水!
我需要它来评估访问的图像 - 如果找不到,则为"正常楼层",如果找到,则为"检测到水!
使用 !strcmp应该假设它甚至不需要费心查看图像,而正常的 strcmp 应该评估正在踩踏的图像。但这并没有发生。
我可以在这里得到一些帮助吗?我真的很感激!
修复您的缩进,您的一个问题变得清晰:
if(!strcmp(image, "WATER")) //false, do no lookup
{
CON_Message("Normal Floor!");
mo->player->deltaviewheight = zmove / 8.0f;
S_StartFX(mo->info->oof_sound, P_MobjGetSfxCategory(mo), mo);
}
else if(strcmp(image, "WATER") == 0) //true, look this up!!
CON_Message("Detected WATER FLAT!");
mo->player->deltaviewheight = zmove / 10.0f;
S_StartFX(mo->info->secretsound, P_MobjGetSfxCategory(mo), mo);
最后两行不是else if
块的一部分。您需要用大括号将要位于else if
块中的语句括起来。
另一个问题是!strcmp(image, "WATER")
和strcmp(image, "WATER") == 0
做完全相同的事情——要么它们都是真的,要么它们都是假的。我不知道你在那里想做什么,但这不是它实际做的事情。
1-您缺少一对围绕else if
块的大括号
2-无论如何else if
永远不会执行。 如果存在匹配项,strcmp 返回 0,这等效于 false。因此,假设存在匹配项,则if()
内部的条件将计算为!0
,该条件的计算结果为true。在 if 条件下,else if (condition)
的计算结果为 else if (0==0) which is also equal to true. Remove the
!",应该没问题。
条件相同,则 if 和 else。我真的不明白你要在那里做什么,因为答案之一反映了。您能就此提供更多意见吗?
就像如果失败时,所有其他如果正在查找,如果它们也失败,它将进入 else 条件。如果错了,请纠正我。对你来说,这两个条件是一样的。
如果 (!0( == 真,如果 (0 == 0( == 真
在这里,玩家的两个条件也与水检测所描述的相同。
在游戏中,我觉得最好使用 strcmpi(( 而不是 strcmp((。但是,这不会为您提供两个条件相同的解决方案。
- 为什么我会" void value not ignored as it ought to be"?
- 为什么编译器说"candidate template ignored: couldn't infer template argument 'InputIterator'"?
- 删除分配的 (?) 指针时"Pointer being freed was not allocated"
- 模板函数参数到模板函数的"candidate template ignored: could not match ..."
- C++生成器 10.2 基于函数的优化状态"unknown attribute 'optimize' ignored"
- 我正在"void value not ignored as it ought to be"我该怎么办?
- D-lang being faster than C++?
- "C4649: attributes are ignored in this context"的含义是什么?
- C++编译错误,"malloc: *** error for object: pointer being freed was not allocated"
- 创建一个移动分配函数,不断得到"pointer being freed was not allocated"
- C++ "Pure Virtual Function Being Called"失败
- 尝试分配函数指针时获取"Void value not ignored as it ought to be"
- "void value not ignored as it ought to be" - 出了什么问题?
- qt resources qrc not being found
- 解析 csv 文件,"malloc: *** error for object 0x7ffeeb4f4b80: pointer being freed was not allocated"出现此错误
- C++ "pointer being freed was not allocated"
- _InterlockedCompareExchange文档中"The sign is ignored"的含义
- 构造函数未被调用并"pointer being freed was not allocated"错误
- "candidate template ignored: substitution failure:"编译器错误?
- C++: strcmp being ignored