Naruszenie zasad dostępu podczas odczytywania w lokalizacji

0

Piszę prostą grę w c++. W skrócie: wygenerowałem w blenderze pliki .obj które wczytuje w programie poprzez

fishModel = obj::loadModelFromFile("models/untitled_000001.obj");

jako że plików jest dużo postanowiłem wrzucić je do struktury vector. Stworzyłem więc

std::vector<obj::Model> vecFish;

i teraz napotkałem problem, którego nie potrafię rozwiązać. Dotyczy to linijki z push'em

fishModel = obj::loadModelFromFile("models/untitled_000001.obj");
vecFish.push_back(fishModel);

Kompilator zwraca błąd o naruszenie zasad dostępu podczas odczytywania w lokalizacji. Wyczytałem, że dotyczyć to może pamięci lub problem z wskaźnikami, których nie użyłem.

1

Pokaż więcej kodu.

0
#include "glew.h"
#include "freeglut.h"
#include "glm.hpp"
#include "ext.hpp"
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <Windows.h>
#include <iomanip>

#include "Shader_Loader.h"
#include "Render_Utils.h"
#include "Camera.h"
#include "Texture.h"

...
// Inicjacja
obj::Model fishModel;
std::vector<obj::Model> vecFish;

...

void renderScene()
{

        //Przykład użycia
        drawObjectColor(&vecFish[i], shipModelMatrix, glm::vec3(0.6f));

}

//Funkcja wczytująca modele
void readFish()
{
    //odczytywanie nazwy pliku (mało ważne)
    std::string a = "models/fish/untitled_000";
    std::string b = ".obj";
    std::string path = "";

    for (int j = 0; j < 121; j++)
    {
        std::stringstream ss;
        ss << j;
        std::string str = ss.str();
        if (j<10) { path = a + "00" + str + b; }
        else
            if (j<100) { path = a + "0" + str + b; }
            else
            {
                path = a + str + b;
            }
        std::cout << path << std::endl;

        fishModel = obj::loadModelFromFile(path);
        //linijka generująca błąd
        vecFish.push_back(fishModel);
    }
}

void init()
{

    readFish();

    //Te wczytywania działają dobrze
    sphereModel = obj::loadModelFromFile("models/sphere.obj");
    groundModel = obj::loadModelFromFile("models/untitled.obj");

}
0

Bez przesady ;-)

Pokaż minimalny kod prezentujący problem.

0

Po dodaniu wskaźników dostaje taki błąd dokładnie:

Nieobsłużony wyjątek w lokalizacji 0x75D9D722 w cw.exe: wyjątek języka Microsoft C++: std::length_error w lokalizacji pamięci 0x008FF6D4. <

0

https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

Strzelam, że w obj::Model łamiesz zasadę 3/5/0.

0

Te obiekty są polimorficzne?
EDIT: jakie duże są te pliki?

0

Raczej znalazłem odpowiedź. Non chromosomal vector jest w stanie przyjąć do około 52kb. W folderze ponadto był ukryty folder .vs który ważył aż 650MB. Po usunięciu wyszedł błąd vector subscript out of range. Najciekawsze w tym wszystkim jest że mniej więcej na początku vector przyjmował te wartości bez błędów i wyświetlał te obiekty. Rozwiązaniem jest chromosomal vector albo po prostu struktura do wczytywania pliku .obj. Dziękuję wszystkim za pomoc i uwagę.

1

Trzeba się nauczyć korzystać z debuggera i czytać crash logi. (Jakie IDE? Jaki kompilator? Jaka Platforma?).
Uruchom aplikację z IDE. Jk nastąpi crash aplikacja się zatrzyma, a IDE będzie pokazywać, gdzie jest problem.
Odnajdź okienko "Call Stack" i wklej tutaj jego zawartość. Zawiera ono informację jak program doszedł do miejsca w którym pojawił się wyjątek.

BTW: do generowania nazwy trzeba było zrobić tak:

        std::stringstream ss;
        ss << a << std::setfill('0') << std::setw(3) << j << b;
        fishModel = obj::loadModelFromFile(ss.str());
0
Defcer napisał(a):

Po dodaniu wskaźników dostaje taki błąd dokładnie:

Nieobsłużony wyjątek w lokalizacji 0x75D9D722 w cw.exe: wyjątek języka Microsoft C++: std::length_error w lokalizacji pamięci 0x008FF6D4. <

http://en.cppreference.com/w/cpp/error/length_error
czyli by widzieć ten exception musisz mieć jakiś błąd w logice obj, który próbuje stowrzyć vector lub string o absurdalnie wielkim rozmiarze.
Stawiam na to, że jakaś niezainicjowana zmienna służy do zmiany rozmiaru vector lub string.
https://wandbox.org/permlink/rU01ndTQ4zn85zUS

Wklej zawartość okna "call stack".

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0