Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;引用全局数组时数组内容已更改 我尝试用OpenGL编写C++代码来渲染SielpSkiixS垫圈。我使用typedef定义了两种新的数据类型,然后创建了指向其中一种新数据类型的指针: typedef GLfloat point2[2]; typedef point2 myTriangle[3]; myTriangle *triangle;_C++_Arrays_Opengl - Fatal编程技术网

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