Naruszenie zasad dostępu podczas odczytywania w lokalizacji

Odpowiedz Nowy wątek
2018-06-12 20:27
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.

edytowany 4x, ostatnio: Defcer, 2018-06-12 20:34
Kod koloruje się znacznikami ```cpp, nie ```c++ - furious programming 2018-06-12 20:31
Ok dzięki - Defcer 2018-06-12 20:33

Pozostało 580 znaków

2018-06-12 20:28
1

Pokaż więcej kodu.


Pozostało 580 znaków

2018-06-12 20:30
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");
 
}
edytowany 4x, ostatnio: Defcer, 2018-06-12 21:21

Pozostało 580 znaków

2018-06-12 21:12
0

Bez przesady ;-)

Pokaż minimalny kod prezentujący problem.


edytowany 1x, ostatnio: Patryk27, 2018-06-12 21:13
Zedytowałem poprzedni post i dodałem opisy. - Defcer 2018-06-12 21:20

Pozostało 580 znaków

2018-06-12 21:27
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. <

edytowany 1x, ostatnio: Defcer, 2018-06-12 21:37

Pozostało 580 znaków

2018-06-12 22:26
kq
0

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

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


Dziękuję za poradnik. Którego podpunktu nie spełniam? Starałem się zredagować to poprawnie. - Defcer 2018-06-12 23:04
MCVE, wklejone fragmenty kodu to za mało, aby zdiagnozować problem. - kq 2018-06-12 23:14
Okej, tylko, że program składa się z 5 headerów i 6 plików cpp. Główny plik cpp jest dość długi. Myślę że wybrałem najważniejsze. Rozumiem że podrzucać skompresowany plik? - Defcer 2018-06-12 23:17
Nie wybrałeś najważniejszych, co widać po zadawanych przez nas pytaniach. Wrzuć projekt na jakiegoś gitlaba i daj linka. - kq 2018-06-13 08:28

Pozostało 580 znaków

2018-06-12 22:37
0

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

edytowany 1x, ostatnio: alagner, 2018-06-12 22:38
Jeden plik .obj ma 55KB. Plików jest 120, ale i tak krzaczy po jednym, czasem wczytuje 5 :/ Nie wiem za bardzo od czego to zależy. - Defcer 2018-06-12 23:00

Pozostało 580 znaków

2018-06-12 23:54
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ę.

to twoje wyjaśnienie jest bezsensu. Szczególnie że nie wiadomo co to jest chromosomal, twój kod nie przeszukuje katalogów, oraz fakt że vector bez problemu łyka gigabajt (limitem jest dostępna pamięć). - MarekR22 2018-06-13 09:10

Pozostało 580 znaków

2018-06-13 08:25
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());

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2018-06-13 09:04
2018-06-13 12:26
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".


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2018-06-13 12:28

Pozostało 580 znaków

2018-06-13 16:39
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[...]lDiq0iAci2St3lUfafbFVlIpcUvVC

edytowany 2x, ostatnio: Defcer, 2018-06-13 18:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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