2016-12-24 25 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文件中,並且從那裏開始一切工作。