2016-12-24 26 views
0

我一直在尝试在用户输入密钥时修改2d数组网格。我所有的程序都是创建一个2D网格,每个单元格都被阻塞/打开。我分配2D阵列在我的main.cpp类,如下所示:通过一个方法被称为显示使用键盘功能修改C++ GLUT中的二维数组指针

point** grid = new point*[size]; 
for (int i = 0; i < size; i++) grid[i] = new point[size]; 

然后,我将其路由到我display.cpp()。我创建了一个全局变量point ** g,用于存储我在main.cpp中分配的2d数组,然后当按下空格时修改某个单元格的阻塞/打开值。

point** g; 
void display(int argc, char** argv, float size, float gridSize, point** _g) { 
    //Assign grid, sz and grid_Sz 
    _g = g; 
    sz = size; 
    grid_Sz = gridSize; 
    //Initialize the GLUT library and negotiate a session with the window system 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(VWIDTH, VHEIGHT); 
    glutCreateWindow("Pathfinding Creator"); 
    glutDisplayFunc(render_callback); 
    glutKeyboardFunc(key_callback); 
    glutReshapeFunc(resize); 
} 

//Key input callback 
void key_callback(unsigned char key, int x, int y) { 
//Start a point that the player is in at the top left corner of the grid (0,0) 
    point position; 
    position.x = 0; 
    position.y = 0; 

    //Constant ASCII codes 
    const int ESC = 27; 
    const int SPACE = 32; 
    switch (key) { 
    case ESC: 
     exit(0); 
     break; 
    case SPACE: 
     //Toggles the grid cell's 'blocked state' if true, put to false, false put to true... 
     g[position.x][position.y].blocked = (g[position.x][position.y].blocked) ? false : true; 
    } 
}   

我遇到的问题是2d网格返回到main.cpp的一种方法。我希望它回来,因为main.cpp将2d网格的所有写入处理为.txt文件。

我现在试图让display()不返回任何东西,并在我的display.h中声明_g作为外部点**,然后在main.cpp中使用它。

这不会改变,我的程序仍然崩溃,我得到一个访问冲突。当按下空格或设置了_g [position.x] [position.y] .blocked的赋值时,它会崩溃。 在display.h:

extern point** _g; 

在display.cpp:

void display(int argc, char** argv, float size, float gridSize, point** grid) { 
    //Assign grid, sz and grid_Sz 
    sz = size; 
    grid_Sz = gridSize; 
    _g = grid; 
    ..... 
} 

最后,我只是在我的main.cpp _g分配到分配网:

point** grid = new point*[size]; 
for (int i = 0; i < size; i++) grid[i] = new point[size]; 
grid = _g; 

我我不确定是否有更好的方法来做到这一点,或者如果我以前的方法可以用一些修补。任何帮助将不胜感激。

+0

你试着返回指针的位在哪里? _g = g;据我所知,没有做任何事情。 _g是一个传入的参数,它是一个本地副本,分配给它,但当函数退出时它会被销毁。 – Zebrafish

+0

我原来的计划是在display()方法的调用中返回它,所以指向** display(....){return display; },但没有奏效。 _g被赋值为g,并且我需要找到一种方法将g返回给main.cpp – vastatio

+0

如果有疑问,请注释掉。哈哈,对不起,伙计,我不理解。把所有东西都拿出来,找出程序崩溃的地方。 – Zebrafish

回答

0

我想你误解了你的_g = g;行正在做。这会将指针值设为g,并将该值赋给局部变量_g。这不会复制所指向的内容。 - 1201ProgramAlarm

非常感谢!我意识到_g实际上并没有复制g的内容,所以我将内存分配移动到了display.cpp文件中,并且从那里开始一切工作。