【问题标题】:is it possible for the same unchanged code to sometimes run and sometimes not?相同的未更改代码是否有可能有时运行而有时不运行?
【发布时间】:2019-03-23 20:13:52
【问题描述】:

我最近一直在学习 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]));

然后我注释掉了我添加的所有代码,以便代码与以前相同,但我仍然会抛出异常。

我认为这一行与我刚刚添加的代码无关是可以理解的,添加的代码会导致这个问题是没有意义的。这实际上是这行代码在更改代码后第二次抛出异常。上次通过不对代码进行任何更改来修复它,最终它运行了,我希望它会再次发生,但我想知道这种非常随机行为的原因可能是什么?

【问题讨论】:

  • 这称为非确定性。

标签: c++ exception opengl error-handling


【解决方案1】:

是否有可能相同的未更改代码有时运行有时不运行?

是的。如果这是您观察到的,那么您应该已经意识到这是可能的。

例如,如果程序有未定义的行为。当行为未定义时,无论出于何种原因,“任何事情”都是可能的,无论是否更改了不相关的内容。

另一个例子是并发程序,根据任务调度程序分配时间的方式,它们的行为会有所不同。

最后,运行时输入的差异显然会改变“未更改”代码的行为。

【讨论】:

  • 好的,谢谢,我有两个问题。 1. 什么是行为未定义的程序? 2. 你能让程序始终运行相同的任务吗?
  • @cooldud 有很多方法可以编写在 C++ 中行为未定义的错误。例如,读取一个不确定的值:int i; int j = i;。 2. 我不明白你的问题。
  • @cooldud: "你能通过始终运行相同的任务来使程序工作吗?" 你也可以通过修复程序中导致它的问题来使其工作调用 UB,不能很好地处理线程,或者表现出不确定的行为。
  • @eerorika 好的,谢谢,我必须阅读未定义的行为,看看我是否能找到我的代码有什么问题
  • @Nicol Bolas,我不知道是什么导致了未定义的行为,我也不明白为什么 eerorkia 给出的示例不起作用,因为 int i 会给 i 一个随机值,然后 j 被分配相同的值随机值
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多