使用 DLL 和 C/C++ 命中断点时结果不同

Different result when hitting breakpoints, using DLL and C/C++

本文关键字:断点 结果 中断 DLL C++ 使用      更新时间:2023-10-16

我正在尝试使用 C/C++ 和我制作并隐式链接的 DLL 为学校开发一个小游戏。目前为止,一切都好。 现在我正在测试一些函数,当我一次运行所有代码或放置断点来停止代码时,我会得到不同的结果。

我将展示一些代码,并尝试尽我所能解释。

struct powerup get_powerup() {
struct powerup aux {};
srand(time(nullptr));
int r = rand() % 100 + 1; // random number between 1 and 100
if (r <= 60) //common
aux.occurrence = common;
else if (r > 60 && r < 90) //rare
aux.occurrence = uncommon;
else if (r >= 90) //very rare
aux.occurrence = rare;
switch (aux.occurrence)
{
case common:
r = rand() % 2 + 1;
if (r == 1)
aux = set_powerup(shield);
if (r == 2)
aux = set_powerup(enemy_boost);
break;
case uncommon:
r = rand() % 3 + 1;
if (r == 1)
aux = set_powerup(ice);
if (r == 2)
aux = set_powerup(battery);
else if (r == 3)
aux = set_powerup(alchool);
break;
case rare:
r = rand() % 2 + 1;
if (r == 1)
aux = set_powerup(life);
if (r == 2)
aux = set_powerup(noclip);
break;
}
return aux;
}

这是我正在测试的功能,非常简单且工作正常。

int _tmain(int argc, TCHAR *argv[]) {
#ifdef UNICODE
_setmode(_fileno(stdin), _O_WTEXT);
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stderr), _O_WTEXT);
#endif
for (int i = 0; i < 10; i++)
{
const struct powerup ajux = get_powerup();
_tprintf(TEXT("power up: %hsn"), powerup_type_string[ajux.type]);
}
system("Pause");
return 0;
}

这是我的主要代码。 现在奇怪的部分,至少对我来说是这样。在你说"因为它是一个随机生成器"之前,请稍等片刻。

一次运行所有代码时,我每次都会得到相同的结果:

power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost
power up: Enemy Boost

但是,如果在 for 循环中放置断点某人,我会得到预期的结果:

power up: Shield
power up: Battery
power up: Ice
power up: Alchool
power up: Alchool
power up: Battery
power up: No Clip
power up: Life
power up: Enemy Boost
power up: Enemy Boost

对此有什么建议吗?

是的,这是因为随机生成器。

你在get_powerup里面打电话给srand(time(nullptr)). 这意味着随机数生成器从每次调用的当前时间开始播种,并且由于time是第二个粒度,因此在运行代码时将显示返回相同的值。

srand的想法是在应用程序启动期间仅调用一次以为 PRNG 设定种子。将其移动到main函数的开头。