Хобрук: Ваш путь к мастерству в программировании

Нарушение доступа SFML при изменении цвета шрифта

У меня проблема в классе меню в моей программе. Когда я пытаюсь переключить цвет текста меню:

void Menu::moveUp()
{
    if (selectedItemIndex -1 >= 0)
    {
        menuLabel[selectedItemIndex].setColor(false);
        selectedItemIndex--;
        menuLabel[selectedItemIndex].setColor(true);
    }
}

void Menu::moveDown()
{
    if (selectedItemIndex + 1 < NUMBER_OF_MENU_LABELS)
    {
        menuLabel[selectedItemIndex].setColor(false);
        selectedItemIndex++;
        menuLabel[selectedItemIndex].setColor(true);
    }
}

void Menu::update()
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        moveUp();
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        moveDown();
    }

}

Исключение по адресу 0x51D45960 (sfml-graphics-d-2.dll) в Xan-Man.exe: 0xC0000005: адрес записи нарушения прав доступа 0x00000008.

в функции

void Writing::setColor(bool color)
{
    if (color)
    {
        text.setFillColor(sf::Color(0, 255, 255)); 
    } 
    else 
    {
        text.setFillColor(sf::Color(255, 255, 255)); 
    }
}

Я пытался реализовать это с помощью sf::Text не моего собственного класса, но это не сработало. Даже когда я не устанавливал шрифт, у меня была та же проблема.

Каким-то образом, когда я нажимаю один раз вниз на клавиатуре, она работает, но когда я нажимаю вверх, она сразу останавливается и не переключается.


Ответы:


1

Может не быть причиной ошибки, но если selectedItemIndex является целым числом без знака, то условие if (selectedItemIndex -1 >= 0) может быть причиной ошибки, если selectedItemIndex равно 0, поскольку это приведет к запуску оператора.

Таким образом, selectedItemIndex переполнится и вернется к максимально возможному значению, представленному в этом типе. Для чего он попытается получить доступ к элементу, который находится за пределами границ, что может вызвать ошибку.

Попробуйте изменить оператор на if (selectedItemIndex > 0)

Если это не поможет, вам нужно будет предоставить нам дополнительную информацию или код.

21.04.2018
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...