Как избежать исключения std :: out_of_range во время векторного вызова? - PullRequest
0 голосов
/ 18 марта 2020

Я работал над базовым c проектом по разработке игры и получил исключение std :: out_of_range в части кода ниже. Я знаю, почему и когда возникает исключение out_of_range, но не может его исправить.

Функция, которая генерирует исключение:

void Texture_Load(std::vector<sf::Texture>  &Target, std::vector<std::string>  Locations) {
    size_t Size = Locations.size();
    for (size_t i = 0; i <= (Size - 1); i++) {
        sf::Texture TMP_Image;
        TMP_Image.loadFromFile(Locations[i]);
        Target.push_back(TMP_Image);
    }
}

Вызов функции:

Texture_Load(Menu_Obj.PNG_Files.at(0), Menu_Obj.PNG_Locations);

Где Векторы PNG_Files и PNG_Locations определены:

std::vector<std::vector<sf::Texture> > PNG_Files; // PNG Files are stored in drawing order
std::vector<std::string>  PNG_Locations;    //Holds the location of PNG Files as Strings

Как вы можете понять, Menu_Obj - это объект ...

В коде эти две переменные изначально не определены.

После получения исключений я попробовал несколько вещей, таких как:

  • Резервирование памяти для вектора "PNG_Files", но без присвоения какого-либо значения
Menu_Obj.PNG_Files.reserve(15);
    for (auto elem : Menu_Obj.PNG_Files) {
        elem.reserve(15);
    }
  • А затем попытался как выделить, так и сохранить в нем одну немую переменную
Menu_Obj.PNG_Files.reserve(15);
    for (auto elem : Menu_Obj.PNG_Files) {
        sf::Texture A;
        elem.push_back(A);
    }

But yet, couldn't find it. I know I can do something that discard exceptions but may cause problems later.

.. I'll be very grateful for any help or suggestion. Have a nice day !



Решение:

После изменения «резерва» функции с "std :: vector :: resize ()" проблема решена.


Menu_Obj.PNG_Files.resize(1);

Добавление одного элемента позволило мне использовать эту векторную ячейку в качестве параметра

...