【发布时间】:2016-03-25 14:32:22
【问题描述】:
我必须在这段代码中使用 fmod 函数而不是 %:
int prob = rand();// % 4;
prob = fmod(prob,4);
if (prob == 0) {
shoot = true;
}
else shoot = false;
如果我使用 %, prob 变量,它不会在调试器上获得任何值。
第二个问题是它永远不会进入 if,我在 if 上设置断点,在 else 上设置另一个断点,在 shoot = true 上设置另一个; 调试器说:断点当前不会被命中。没有关联调试器目标代码类型的可执行代码。
在其他计算机上不存在第二个问题。
全功能:
void cVoladorEstatico::Logic(int *map)
{
double t1 = glutGet(GLUT_ELAPSED_TIME);
if (t1 - moveDelaySteering > 20 * 20) {
random_variable = rand();
moveDelaySteering = t1;
}
if (t1 - moveDelay > 20) {
int aux = y;
y += random_variable%speed - 3;
//Whats next tile?
if ((y % TILE_SIZE) <= 1)
{
/*y += speedY;
x += speedX;*/
//si choca con tile, se autodestruye muy fuerte
if (CollidesMapWall(map, false)) y = aux; //delete this;
}
//Advance, no problem
else
{
/*y += speedY;
x += speedX;*/
//TODO: si choca, hace magia
}
moveDelay = t1;
}
//should i shoot
//if (t1 - lastShootDec > shootChance) {
int prob = rand();// % 4;
prob = fmod(prob,4);
if (prob == 0) {
shoot = true;
}
else shoot = false;
//}
}
【问题讨论】:
-
你重新编译你的代码了吗?
-
为什么要在
int上使用fmod? -
您应该使用
(value & 3)而不是%或fmod。某些编译器可能比% 4更有效地编码& 3,具体取决于优化级别。 -
@Thomas Matthews:恰恰相反。如果您需要余数,则为
%,而不是&。如果您特别需要余数,请不惜一切代价避免使用&。任何无法为%和&在等效的情况下生成相同、最有效的代码的编译器都会很快被市场淘汰。但是,对于有符号类型,%和&通常是不等价的。 -
在原始代码中,调试器很可能在骗你。优化器很有可能删除了
prob变量,因为它仅在if语句的条件下使用。试着写出prob的值,看看到底发生了什么。原始代码应该可以正常工作。
标签: c++ visual-studio debugging random visual-studio-2015