【问题标题】:Exception thrown at 0x00000000 in ConsoleApplication1.exe: 0xC0000005: Access violation executing location 0x00000000在 ConsoleApplication1.exe 中的 0x00000000 处引发异常:0xC0000005:访问冲突执行位置 0x00000000
【发布时间】:2017-05-15 20:38:09
【问题描述】:

在人们告诉我缩短程序后,我就这样做了,这是程序的缩短版本,与上述相同的错误。它只在进入程序几分钟后出现。如果我点击继续,程序工作正常.但是看到运动功能吗?它不起作用。精灵拒绝向任何方向移动。但是,如果我在移动中给出一个非常大的浮动值,那么当我启动程序时,精灵就会从它的位置移位停留在那个位置,没有进一步的移动。例如,如果我写 sprite.move(400.f,400.f),精灵会从 (0,0) 移动到 (400,400) 并停留在那里。它不会移动任何更多的。 这是代码的简化版本:

#include"SFML\Graphics.hpp"
#include<iostream>
int main()

{
sf::RenderWindow window(sf::VideoMode(640, 480), "CHECK",sf::Style::Default);
std::cout << "WORKS";
sf::Texture text;
text.loadFromFile("bahamut.png");
sf::Sprite sprite;
sf::Clock frap;
sprite.setTexture(text);
while (window.isOpen())
{
    float fps = frap.restart().asSeconds();
    sf::Vector2f movements;
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A))
    {
        movements.y = 0;
        movements.x = -1 * fps;
    }
    else
  {if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D))
    {
        movements.y = 0;
        movements.x = 1 * fps;
    }
    else
   {    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S))
    {
        movements.y = 1 * fps;
        movements.x = 0;
    }
       else
     {
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W))
      {
        movements.y = -1 * fps;
        movements.x = 0;
      }
      else
      {
        movements.x = 0;
        movements.y = 0;
      }
     }
    }
   } 
    sprite.move(movements);
    window.clear();
    window.draw(sprite);
    window.display();

}
return 0;
}

我改进了代码,它仍然产生相同的结果和错误。 在使用反汇编程序时,我看到崩溃发生在

00B37AEE cmp esi,esp
在 window.display() 中。 当我创建一个函数并使用它来显示精灵时,运动会发生但没有 unction nada

【问题讨论】:

  • 你应该首先将你的移动初始化为零向量,如果你只允许 向上或向下移动,你不需要所有的 if else 你可以用 just if 来做到这一点声明,因为无论如何您都在覆盖运动中的每个元素。你等多久才能看到你的精灵移动?要注意到任何显着的移动,您必须按住一个键至少 3 秒钟才能看到他根据您的移动速度移动 3 个像素(假设它使用浮点向量存储其位置......)。至于报错信息,不看你的调用栈,我也做不了什么。

标签: visual-c++ visual-studio-2015 sfml


【解决方案1】:

您的逻辑表明,如果按下 W,则您的动作为 0/0。 W 按下块的else 会覆盖所有先前的设置。移动精灵应该发生在你之前display

我看不到空指针异常的原因,但这就是调试器的用途。下次发生这种情况时,请调试。

哦,它是int main(),而不是void。我知道编译器可以容忍这个错误,但它仍然是一个错误和未定义的行为。

【讨论】:

  • 等一下,我记得在 C++ 中使用 void 为什么我们不能在这里使用 void?您能否在此调试部分帮助我。我发现堆栈跟踪完全没有帮助。我不知道它是关于什么的。
  • 如果您的编译器允许,您可以使用void main(),这是错误的,如果它以void main() 开头,您的编译器的下一个编译器或版本可以正确地对您的代码做任何他喜欢的事情。所以不要这样做。如果您不按“继续”,调试部分会发生什么。我无法通过互联网真正帮助您,您必须尝试阅读一本好书或教程。
  • 嘿,我现在用 else 语句编辑了代码,但它仍然不起作用。我正在尝试查找调试部分。如果我发布堆栈跟踪会有帮助吗?请我知道我很愚蠢,但请帮助我,我是这里的新手
  • 调试是一种技能。我无法通过互联网教你 255 个字符的技能。请去阅读一本书或观看有关“如何调试”的 youtube 教程。你并不愚蠢,我们都必须在职业生涯的某个阶段学习这一点。但这并不意味着我们可以在没有你做我们所做的事情的情况下以某种方式教你:阅读它。
  • 哦,在引入断点时它告诉我 window.display() 是要执行的下一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多