程序在调试中工作正常,但在发布中不行
Program works fine in Debug, but not in Release
我制作了一款效果不错的井字游戏。最近我决定添加一个重置游戏功能。这里是我从user
获取输入的部分void playerMove() //Gets the player move and updates the box variables
{
int boxnumber;
while(1) //Set's loop if the player enters a invalid input
{
cout << "n Player " << player << "'s turn!(Press 0 to reset the game!): ";
cin >> boxnumber;
if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) // Checks if the input is valid or not
{
system("CLS");//If invalid, show error and loop back to start to get new input
displayBoard();
cout << "n Invalid Input! Try again!n";
}else if(boxnumber == 0)
{
refreshGame();
displayBoard();
}else
{
box[boxnumber-1] = player;//If inputs are fine, set the box variable's and break out of loop!
break;
}
}
}
现在,在调试模式下,当我按0时,一切运行正常,游戏被重置,但在发布版本中,当我按0时,它给我"无效输入!"再试一次!"
我试过的东西都不起作用:-重新构建整个发布和调试版本。-创建一个新项目并复制粘贴我的代码。同样的道理,调试可以,发布不行。
对于任何想知道的人,我使用code::blocks IDE。编译器是GNU GCC。谢谢你的帮助!:)
您有未定义行为。
在"第一个"if
中,您有box[boxnumber-1]
,因此当您输入0
(正如您在问题中所述)时,您试图访问索引为-1
的元素。这是UB,因为你正在读取"无效"内存。
您应该首先检查0
(以及负数)。
在if
语句中,将范围检查放在值检查之前。也就是说,修改
if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0)
if(boxnumber < 0 || box number > 9 || box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O')
利用了短路的优势:如果输入值小于0或大于9,则不会执行值检查。这将避免检查像box[10]
这样的东西,这是无效的。
仍然留下了一个问题:如果用户输入0,该代码将很高兴地检查box[-1]
,这也超出了范围。要消除这种情况,请将测试box number == 0
的if
语句的分支移到该部分前面:
if (box number == 0)
// whatever
else if (box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0)
// whatever else
相关文章:
- TDateTime格式在C++Builder中不会更改
- 两个字符串在 c++ 中不相等
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- 为什么二进制搜索在我的测试中不起作用
- SCANF 在 Eclipse 中不接受调试模式下的输入?
- import_array在嵌入式Python C API的调试版本中不起作用
- Python在调试模式下以C 工作,但在EXE文件中不工作
- 无法在谷歌测试中捕获调试断言(死亡测试不满足它)
- 该代码在调试模式下工作,但在发布模式C 中不起作用
- 预编译HEADERS在使用Qt Creator/qmake/MinGw的调试构建中不起作用
- 二进制不是使用 Visual Studio 2008 中的调试信息构建的
- 在调试器模式下工作,但在最终版本中不起作用.为什么
- 在C++托管中,调试和安装版本之间的XOR行为不一致
- 可以从命令行运行C++代码,但不能从visual studio中的调试模式运行
- 在带有OpenCV的Visual Studio学习版中使用“启动调试”或“启动而不调试”
- c++中带调试信息和不带调试信息的函数设计方法
- GDB 调试器在代码::块中不起作用
- For循环在调试器中不能正常工作
- NDK 调试 - 在 Android Studio 中不会命中断点