我最近一直在学习OpenGL,而在使用OpenGL时,遇到了一种情况,我的代码无法运行,并且我尝试了一些不起作用的事情,然后有一天,没有进行任何更改,代码刚刚运行。
起初,我以为我一定是不小心更改了某些内容或忘记了所做的更改,即使我确定自己没有,但是最近发生的这种情况大约是我的3到4遍我目前的情况。
我有一个很长的OpenGL程序,它是第一人称射击游戏,我想添加一个功能,该功能允许用户在游戏运行时通过按住向上或向下键来更改灵敏度。因此,我将此代码添加到了主文件中:
void change_sensitivity(GLFWwindow* window);
float sensitivity = 0.3f; //make sensitivity a global variable
... //all the main code//
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{
...
// I remove this line:
// float sensitivity = 0.3f;
// as it is now global
...
}
void change_sensitivity(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)
sensitivity += 0.01;
else if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS)
sensitivity -= 0.01;
}
将其添加到先前可以正确运行的代码中后,此行引发了异常:
GLCall(glUniformMatrix4fv(glGetUniformLocation(a_shader_ID, model.c_str()), 1, GL_FALSE, &a_model_matrix[0][0]));
然后我注释掉所有添加的代码,以使这些代码与以前相同,并且仍然会引发异常。
我认为这行与我刚刚添加的代码无关,这是可以理解的,并且添加的代码将导致此问题也没有意义。这实际上是这行代码在更改代码后第二次引发异常。上次是通过不对代码进行任何更改来修复它的,最终我希望它再次运行,但我想知道这种非常随机的行为的原因是什么?
答案 0 :(得分:3)
相同的未更改代码有时可能运行而有时却没有运行吗?
是的。如果是您观察到的结果,那么您应该已经意识到这是可能的。
例如,如果程序具有未定义的行为。如果未定义行为,则无论是否更改了不相关的内容,由于任何原因都可以进行“任何操作”。
另一个示例是并发程序,它们的行为取决于任务计划程序分配时间的方式。
最后,运行时输入中的差异显然可以改变“不变”代码的行为。