c++;引用全局数组时数组内容已更改 我尝试用OpenGL编写C++代码来渲染SielpSkiixS垫圈。我使用typedef定义了两种新的数据类型,然后创建了指向其中一种新数据类型的指针: typedef GLfloat point2[2]; typedef point2 myTriangle[3]; myTriangle *triangle;
我编写了一个函数c++;引用全局数组时数组内容已更改 我尝试用OpenGL编写C++代码来渲染SielpSkiixS垫圈。我使用typedef定义了两种新的数据类型,然后创建了指向其中一种新数据类型的指针: typedef GLfloat point2[2]; typedef point2 myTriangle[3]; myTriangle *triangle;,c++,arrays,opengl,C++,Arrays,Opengl,我编写了一个函数init,它包含三个点,然后创建一个新的myTriangle,然后将其分配给*triangle void init(point2 p1, point2 p2, point2 p3){ myTriangle t; t[0][0] = p1[0]; t[0][1] = p1[1]; t[1][0] = p2[0]; t[1][1] = p2[1]; t[2][0] = p3[0]; t[2][1] = p3[1];
init
,它包含三个点,然后创建一个新的myTriangle
,然后将其分配给*triangle
void init(point2 p1, point2 p2, point2 p3){
myTriangle t;
t[0][0] = p1[0];
t[0][1] = p1[1];
t[1][0] = p2[0];
t[1][1] = p2[1];
t[2][0] = p3[0];
t[2][1] = p3[1];
triangle = &t;
}
这是我的diplay
功能:
void display(void){
static point2 p = {1,1};
int i;
//pick a random vertex
i = rand() % 3; //i in the range 0 to 2
p[0] = (p[0] + *triangle[i][0])/2;
p[1] = (p[1] + *triangle[i][1])/2;
cout << p[0] << ' , ' << p[1] << endl;
//display new points
glBegin(GL_POINTS);
glVertex2fv(p);
glEnd();
}
问题是三角形
引用了局部变量,这导致了未定义的行为
typedef GLfloat point2[2];
typedef GLfloat myTriangle[3][2]; // EDIT
myTriangle *triangle;
问题是三角形
引用了局部变量,这导致了未定义的行为
typedef GLfloat point2[2];
typedef GLfloat myTriangle[3][2]; // EDIT
myTriangle *triangle;
编译和运行良好,应该做你想做的
编译和运行良好,应该做你想做的。除了Mahesh的答案之外,
*triangle[i][0]
可能不会做你想做的事。它相当于*(三角形[i][0])
。由于三角形
指向单个三角形,因此如果i>0
,则为UB。您需要改为执行(*triangle)[i][0]
。这将首先取消对指针的引用。除了Mahesh的答案之外,*三角形[i][0]
可能不会执行您想要的操作。它相当于*(三角形[i][0])
。由于三角形
指向单个三角形,因此如果i>0
,则为UB。您需要改为执行(*triangle)[i][0]
。这将首先取消对指针的引用。您正在init
函数中分配局部变量的地址。当init
返回时,您分配的地址不再有效,因为绑定到该地址的变量是本地变量
void init(point2 p1, point2 p2, point2 p3)
{
myTriangle t;
t[0][0] = p1[0];
t[0][1] = p1[1];
t[1][0] = p2[0];
t[1][1] = p2[1];
t[2][0] = p3[0];
t[2][1] = p3[1];
triangle = &t; // <-- assigning address of local variable. No good.
}
void init(点2 p1、点2 p2、点2 p3)
{
myt;
t[0][0]=p1[0];
t[0][1]=p1[1];
t[1][0]=p2[0];
t[1][1]=p2[1];
t[2][0]=p3[0];
t[2][1]=p3[1];
triangle=&t;//您正在init
函数中分配局部变量的地址。当init
返回时,您分配的地址不再有效,因为绑定到该地址的变量是局部变量
void init(point2 p1, point2 p2, point2 p3)
{
myTriangle t;
t[0][0] = p1[0];
t[0][1] = p1[1];
t[1][0] = p2[0];
t[1][1] = p2[1];
t[2][0] = p3[0];
t[2][1] = p3[1];
triangle = &t; // <-- assigning address of local variable. No good.
}
void init(点2 p1、点2 p2、点2 p3)
{
myt;
t[0][0]=p1[0];
t[0][1]=p1[1];
t[1][0]=p2[0];
t[1][1]=p2[1];
t[2][0]=p3[0];
t[2][1]=p3[1];
triangle=&t;//问题仍然存在,但这次值仅在第一次引用之后更改,并且保持不变。请阅读线程-问题仍然存在,但这次值仅在第一次引用之后更改,并且在第一次引用之后保持不变。请阅读线程-它在第一次调用之后仍然更改,我只是y将它们打印10次,第一次打印正确的值,但之后它们会改变并保持不变。cout第一次调用后仍然会改变,我只是尝试打印10次,第一次打印正确的值,但之后它们会改变并保持不变。cout