【问题标题】:I can not open and image using the SFML library我无法使用 SFML 库打开和图像
【发布时间】:2019-07-18 03:03:02
【问题描述】:

我无法打开 test15.bmp。当我运行程序时,它试图打开一个窗口但崩溃了。据我所知,问题线是image.loadFromFile(...);

Exception thrown at 0x50E82CC4 (vcruntime140.dll) in
MandelbrotProject.exe: 0xC0000005: Access violation reading location
0x00741000.

这是我使用image.loadFromFile("test15.bmp") 而不是绝对路径时遇到的异常。

我已经链接并包含了 SFML 教程中描述的所有内容。 https://www.sfml-dev.org/tutorials/2.5/start-vc.php

我正在使用 Visual C++(2017)-32 位 SFML 和 Microsoft Visual Studio 2017。

#include "pch.h"
#include<iostream>
#include "Fractal.h"
#include "RGB.h"
#include "Zoom.h"
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf::Glsl;
using namespace project;

int main() {

    Fractal fractal(800, 600);

    fractal.addRange(0.0, RGB(0, 0, 0));
    fractal.addRange(0.3, RGB(255, 0, 0));
    fractal.addRange(0.5, RGB(255, 255, 0));
    fractal.addRange(1.0, RGB(255, 255, 255));
    fractal.addZoom(Zoom(295, 202, 0.1));
    fractal.addZoom(Zoom(312, 304, 0.1));//specified zooms
    fractal.run("test15.bmp");

    cout << "Zooming!" << endl;
    double zoom = 0.1;
    double offsetX = 400.0;
    double offsetY = 300.0;

    sf::RenderWindow window(sf::VideoMode(800, 600), "Mandelbrot");
    window.setFramerateLimit(0);
    sf::Image image;
    image.loadFromFile("D:\Visual Studio
projects\MandelbrotProject\MandelbrotProject\test15.bmp");

    if (!image.loadFromFile("test15.bmp")) { return -1; }
    sf::Texture texture;
    sf::Sprite sprite;

    bool stateChanged = true;
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            switch (event.type) {
            case sf::Event::Closed:
                window.close();
                break;
            case sf::Event::KeyPressed:
                stateChanged = true; 
                switch (event.key.code) {
                case sf::Keyboard::Escape:
                    stateChanged = false;
                    window.close();
                    break;
                case sf::Keyboard::Equal:
                    zoom *= 0.9;
                    break;
                case sf::Keyboard::Dash:
                    zoom /= 0.9;
                    break;
                case sf::Keyboard::W:
                    offsetY -= 40 * zoom;
                    break;
                case sf::Keyboard::S:
                    offsetY += 40 * zoom;
                    break;
                case sf::Keyboard::A:
                    offsetX -= 40 * zoom;
                    break;
                case sf::Keyboard::D:
                    offsetX += 40 * zoom;
                    break;
                default:stateChanged = false;
                    break;
                }
            default:
                break;
            }
        }
        if (stateChanged) { 
            fractal.addZoom(Zoom(offsetX, offsetY, zoom));
            fractal.run("test15.bmp");
            texture.loadFromFile("test15.bmp");
            sprite.setTexture(texture);
        }
        window.clear();
        window.draw(sprite);
        window.display();
        stateChanged = false;
    }
    cout << "Finished!" << endl;
    cin.get();
    return 0;
}

【问题讨论】:

  • 在`image.loadFromFile("D:\\Visual Studio projects\\MandelbrotProject\\MandelbrotProject\\test15.bmp");'行中使用双斜杠\\
  • 在控制台中写入一些奇怪的东西时,它仍然显示一个白色窗口并崩溃。

标签: c++ visual-studio sfml


【解决方案1】:

默认情况下,Visual Studio 将项目目录视为工作目录

如果我没记错的话,D:\Visual Studio projects\MandelbrotProject\MandelbrotProject\ 在你的情况下。您应该确保您的 test15.bmp 在该目录中。

以防万一,您可以通过打开项目属性->配置属性->输出目录来检查哪个是您的$(ProjectDir)(可以使用任何字段)。单击下拉箭头并编辑。打开并写$(ProjectDir)

更多关于VS macros的信息

【讨论】:

  • 感谢您的帮助。我发现我的问题是我应该在添加“sfml-graphics.lib,sfml-window.lib,sfml-system.lib”时添加“-d”(它们应该是:“sfml-graphics-d.lib,sfml-window-d.lib,sfml-system-d.lib”);
猜你喜欢
  • 2021-06-26
  • 2019-07-03
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多