2012-05-30 3 views
0

Я пытаюсь получить доступ к данным/печати из vector3f, что приводит к EXC_BAD_ACCESS:Доступ к данным в векторе создает EXC_BAD_ACCESS

std::cout << myMesh.faces[1].vertices[1].pos.x; 

Код:

struct Vector2f{ 
    float x, y; 
}; 
struct Vector3f{ 
    float x, y, z; 
}; 

struct ObjMeshVertex{ 
    Vector3f pos; 
    Vector2f texcoord; 
    Vector3f normal; 
}; 

struct ObjMeshFace{ 
    ObjMeshVertex vertices[3]; 
    ObjMeshFace(){} 
    ObjMeshFace(const ObjMeshFace& o) 
    {for (int i=0; i < 3; ++i) vertices[i] = o.vertices[i]; } 
}; 

struct ObjMesh{ 
    std::vector<ObjMeshFace> faces; 
}; 

ObjMesh myMesh; 

for(size_t i = 0; i < faces.size(); ++i){ 
    ObjMeshFace face; 
    for(size_t j = 0; j < 3; ++j){ 
     face.vertices[j].pos  = positions[(faces[i].pos_index[j] - 1)]; 
     face.vertices[j].texcoord = texcoords[faces[i].tex_index[j] - 1]; 
     face.vertices[j].normal  = normals[faces[i].nor_index[j] - 1]; 
    } 
    myMesh.faces.push_back(face); 
} 

Отладчик относится к stl_vector.h:

reference 
    operator[](size_type __n) 
    { return *(this->_M_impl._M_start + __n); } 

Что это значит? Я вызываю из диапазона?

+0

вы что-то толкнули в лицо? похоже, что он по-прежнему пуст. –

+0

@ AndersK, данные theres в лицах, im используя это для рендеринга OpenGL, и все работает так, как должно. По какой-то причине я просто не могу его получить. – JavaCake

+0

Давайте посмотрим на весь код - лучший пример с минимальным компилятором - поскольку мы не можем видеть, как вы называете свои объекты и как они были настроены _ +, как сказано, пожалуйста, используйте теги, поскольку Xcode обычно является Objective C – Mark

ответ

0

Это было какое-то время, но когда вы делаете push_back, вы только мелко копируете массив вершин vertices[] = vertices[]. Вам нужна специальная копия-ctor в ObjMeshFace. Вот почему vertices[0].pos.x работает и vertices[1].pos.x нет.

+0

Можете ли вы объяснить немного дальше? Я точно не понимаю. – JavaCake

+0

Когда вы делаете push_back на свой вектор, вы помещаете копию своего объекта на этот вектор. Vector2f, Vector3f, все хорошо копируются, поскольку они состоят из простых объектов, но в C/C++ вы не можете скопировать массив, просто указав [] = b []. Если вы скажете [] = b [], вы копируете только указатель. Таким образом, для push_back всего объекта ObjMeshFace вы можете добавить CopyContructor (метод), который push_back автоматически вызовет, оттуда вы можете скопировать индекс массива по индексу. – jiveturkey

+0

Это делает больше смысла. С его рабочего кода и я не хочу ничего испортить, есть ли способ сделать обходной путь? – JavaCake