我是c ++指针的新手,我遇到从指针获取值的问题。
我有一个指针verticesPosBegin,它指向用于保存顶点位置的数组的开头。每个顶点都存储为3分量浮点矢量(xyz)。
我需要从中获取每个顶点并访问其x,y,z值。
我是通过以下方式做到的:
NxVec3* positions = (NxVec3*)data.verticesPosBegin;
for(int i=0;i<nrVertices;i++)
{
NxVec3* p1 = (NxVec3*)positions;
printf("Vertex coordinates x: %d, y: %d, z: %d\n", p1->x, p1->y, p1->z);
positions++;
}
(NxVec3是由我使用的物理引擎定义的类型,它基本上是一种形式的结构(float x,float y,float z))
但是这不能得到坐标的值,但我想,地址,因为它们代表非常大的数字。任何帮助将不胜感激。
答案 0 :(得分:6)
根据您的陈述,p1->x
,p1->y
和p1->z
的类型为float
,对吗?如果是这样,您将不正确的格式字符串传递给printf。 %d
标志用于整数。您可能希望使用%f
标志。你获得的巨大数字不是地址,而是浮点值,转换为双精度,然后它们的位模式被解释为整数,尽管它在技术上是未定义的行为。
http://en.cppreference.com/w/cpp/io/c/fprintf
如果你使用cout,你不必担心这样的事情,因为它是类型安全的。
P.S。
停止施放。它只会隐藏编译时间,并将它们转换为运行时错误,这会更糟糕。
答案 1 :(得分:1)
data.verticesPosBegin
指向一个连续的Nx3浮动块float x, y, z;
以下内容应该有效:
NxVec3 *positions = (NxVec3*)data.verticesPosBegin, *p(positions);
for(unsigned int i=0;i<nrVertices;i++)
{
cout << "Vertex coordinates ";
cout << "x: " << p->x << ", ";
cout << "y: " << p->y << ", ";
cout << "z: " << p->z << endl;
++p;
}
答案 2 :(得分:0)
如果我得到NxVec3
权限,则定义为NxVec3,因此,根据头文件,以下内容应该有效:
NxVec3* positions = (NxVec3*)data.verticesPosBegin;
for(int i = 0;i < nrVertices; ++i)
{
float *p = positions[i].get();
cout << p[0] << ' ' << p[1] << ' ' << p[2] << endl;
}