使用键盘功能修改C ++ GLUT中的2D数组指针

时间:2016-12-24 02:34:01

标签: c++ arrays glut

当用户输入密钥时,我一直在尝试修改二维数组网格。我的所有程序都是创建一个2d网格,其中每个单元格都被阻止/打开。我在main.cpp类中分配了2d数组,如下所示:

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

然后,我通过名为display()的方法将其路由到display.cpp。我创建了一个全局变量点** 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;

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

1 个答案:

答案 0 :(得分:0)

  

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

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