使用 DLL 和 C/C++ 命中断点时结果不同
Different result when hitting breakpoints, using DLL and C/C++
我正在尝试使用 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
函数的开头。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 无法删除指针,已触发断点
- 使用++运算符会导致意外的结果
- 条件断点在不应该触发时触发
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 使用 DLL 和 C/C++ 命中断点时结果不同