C++ 访问向量中的数据会导致EXC_错误访问
我试图从矢量3f访问/打印数据,这会导致C++ 访问向量中的数据会导致EXC_错误访问,c++,objective-c,C++,Objective C,我试图从矢量3f访问/打印数据,这会导致EXC\u BAD\u访问: std::cout << myMesh.faces[1].vertices[1].pos.x; 这是什么意思?我在呼叫范围之外吗?已经有一段时间了,但是当你做回推时,你只是简单地复制顶点数组顶点[]=顶点[]。在ObjMeshFace中需要一个自定义副本。这就是为什么顶点[0]。pos.x有效,而顶点[1]。pos.x无效 你把什么东西推到脸上了吗?看起来它仍然是空的。@AndersK,面中有数据,我用它来渲染O
EXC\u BAD\u访问
:
std::cout << myMesh.faces[1].vertices[1].pos.x;
这是什么意思?我在呼叫范围之外吗?已经有一段时间了,但是当你做回推时,你只是简单地复制顶点数组
顶点[]=顶点[]
。在ObjMeshFace中需要一个自定义副本。这就是为什么顶点[0]。pos.x
有效,而顶点[1]。pos.x
无效 你把什么东西推到脸上了吗?看起来它仍然是空的。@AndersK,面中有数据,我用它来渲染OpenGL,一切正常。由于某些原因,我无法以这种方式访问它。让我们看看所有的代码-一个最小的可编译示例是最好的-因为我们看不到您如何调用对象以及它们是如何设置的+如前所述,请标记有用的代码,因为Xcode通常是客观的C@Mark,我添加了更多的代码来显示如何填充数据。正如在AndersK的另一条评论中提到的,这是我用于渲染目的的函数代码。@请注意,在struct ObjMesh
中,当您对向量进行推回操作时,您将在该向量上放置对象的副本。Vector2f、Vector3f都可以很好地复制,因为它们是由简单的对象组成的,但是在C/C++中,不能简单地说a[]=b[]来复制数组。如果你说a[]=b[],你只是在复制指针。因此,要将整个ObjMeshFace对象推回,您可以添加一个CopyConstructor(方法),推回将自动调用,从那里您可以逐个索引复制数组索引。这更有意义。由于它的工作代码,我不想搞砸任何事情,有没有办法做一个变通?因为有一个问题,你必须改变一些东西。这真的很简单。在struct ObjMeshFace
中,只需添加ObjMeshFace(const ObjMeshFace&o){for int i=0;i<3;++i)顶点[i]=o.vertices[i];}
我想不出多少。代码缺少一些括号,因此我将其更正为ObjMeshFace(const ObjMeshFace&o){for(int i=0;i<3;++i)顶点[i]=o.vertices[i];}/code>,这不起作用。。由于<代码>没有匹配的构造函数来初始化“ObjMeHeFACE”< /代码>我的道歉,当你这样做时,C++也需要添加一个默认构造函数;创建对象时调用的方法。在这里,您可以初始化数组,或者您可能只想添加以下伪造的默认构造函数ObjMeshFace(){}
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);
}
reference
operator[](size_type __n)
{ return *(this->_M_impl._M_start + __n); }