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".

0

Call stack:

FishGame.exe!obj::convertToModel(const obj::ObjModel & obj) Wiersz 203	C++	Symbole zostały załadowane.
 [Ramka wbudowana] FishGame.exe!obj::loadModel(std::basic_istream<char,std::char_traits<char> > &) Wiersz 243	C++	Symbole zostały załadowane.
 FishGame.exe!obj::loadModelFromFile(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & str) Wiersz 253	C++	Symbole zostały załadowane.
 FishGame.exe!readFish() Wiersz 180	C++	Symbole zostały załadowane.
 FishGame.exe!init() Wiersz 193	C++	Symbole zostały załadowane.
 FishGame.exe!main(int argc, char * * argv) Wiersz 247	C++	Symbole zostały załadowane.
 [Kod zewnętrzny]		Ramka z adnotacją

Ogólnie dzisiaj odpaliłem program z 30 razy i tylko 2 razy zgłosił błąd.
Ważna informacja, że kompiluje w trybie release (taką dostałem poradę, że mam tak robić). W trybie debug wgle kompilacja nie przechodzi i wywala błąd: map/set iterator not dereferencable. Kod (silnik) ogólnie jest wzięty od mojego ćwiczeniowca, i na tym kodzie mam opierać swoją gierkę.

Jeżeli ktoś chce:
https://gitlab.com/Defcer/Fish_Game
i modele:
https://drive.google.com/open?id=1PijlDiq0iAci2St3lUfafbFVlIpcUvVC

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