Ошибка сегментации в SFML, когда я пытаюсь нарисовать объект sf :: Text - PullRequest
0 голосов
/ 16 октября 2019

Я использую SFML для школьного проекта, и у меня возникает эта проблема, когда я пытаюсь запустить этот код, я получаю ошибку: двойное освобождение или повреждение (выход), и программа вылетает. Моя операционная система Ubuntu.

Я пытался создать "текст" с malloc. В этом случае ошибок нет, но все равно происходит сбой (я все еще получаю ошибку сегментации). Я даже пытался отправить этот код другу, он работает для него, так что я думаю, что что-то не так с моей конфигурацией или что-то в этом роде?

int main(){
    sf::RenderWindow window(sf::VideoMode(500, 320), " Text ");
    sf::Event event;
    sf::Font font;
    font.loadFromFile("../arial_narrow_7.ttf");
    sf::Text text("hello", font);
    text.setCharacterSize(30);
    text.setStyle(sf::Text::Bold);
    text.setFillColor(sf::Color::Red);
    text.setFont(font);

    while(window.isOpen()) {
        window.draw(text);
        window.display();
        window.clear();
    }
}

Он должен нарисовать текст "привет" красным цветом, но какЯ сказал, что программа вылетает.

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

ОК, как предположил Бернард, проблема была внешней по отношению к самому коду, моя версия SFML была слишком старой, 2.3 Думаю, я ее не заметил, потому что пытался обновить ее с помощью команды sudoupgrade / sudo update и там говорилось, что все обновлено, поэтому, когда я заметил, что версия в файле SFML / Config.hpp устарела, я переустановил SFML вручную, а самые новые файлы с сайта SFML были обновлены. Спасибо всем за ваше время и ваши полезные советы:)

0 голосов
/ 21 октября 2019

Цикл событий

Необходимо добавить цикл обработки событий, чтобы окно работало правильно.

Согласно SFML-учебникам :

Ошибка, которую часто совершают люди, заключается в том, что они забывают о цикле событий просто потому, что им до сих пор нет дела до обработки событий. (вместо этого они используют входы в реальном времени). Без цикла событий окно перестает отвечать на запросы. Важно отметить, что цикл обработки событий имеет две роли: в дополнение к предоставлению событий пользователю, он также дает окну возможность обрабатывать свои внутренние события, что необходимо для того, чтобы он мог реагировать на перемещение или изменение размера действий пользователя.

Таким образом, ваш код должен выглядеть следующим образом:

#include <SFML/Window.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(500, 320), " Text ");
    sf::Font font;
    font.loadFromFile("../arial_narrow_7.ttf");
    sf::Text text("hello", font);
    text.setCharacterSize(30);
    text.setStyle(sf::Text::Bold);
    text.setFillColor(sf::Color::Red);
    text.setFont(font);
    // run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }
        window.clear();
        window.draw(text);
        window.display();
    }

    return 0;
}

У вас даже был объявлен неиспользованный sf::Event в начале кода.

...