2016-06-30 81 views
1

我正在尋找一個解決方案,但我不能使用任何沒有錯誤。 我試圖在控制檯中繪製地圖,使用multidismentional數組。我想要更多地圖,但是如果不發送無用的代碼,我就無法做到。這是地圖:試圖使用多維數組指針

char map2[11][15] = { 
"###^######^###", 
"#L   #", 
"^S   #", 
"#S   #", 
"# K  #", 
"########### #", 
"#G   #", 
"#  #### #", 
"#  #M #", 
"# @  # #", 
"## ########^##"}; 

,這是移動腳本:

void Game::showing_different_maps() 
{ 
    differentmap= true; 
    while (differentmap) 
    { 
     system("cls"); 
     for(int i = 0; i < 81; i++) // i < map2[y][] 
     { 
      cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH! 
     } 
    system("pause>nul"); // this line prevent lagging somehow 

     if(GetAsyncKeyState(VK_UP)) // arrows to move on axis (y, x) 
     { 
      mapka.move(-1, 0);      
     } 
     if(GetAsyncKeyState(VK_DOWN)) 
     { 
      mapka.move(1, 0); 
     } 
     if(GetAsyncKeyState(VK_RIGHT)) 
     { 
      mapka.move(0, 1); 
     } 
     if(GetAsyncKeyState(VK_LEFT)) 
     { 
      mapka.move(0, -1); 
     } 

    } 

} 

,這裏是什麼,我可以在互聯網上找到。

Wut wut(3, 13); 
    Maps *wsk; 
    pointer = &wut; 

    char (*somemap)[81] = new char[81][81]; 
    somemap= &map2[81]; 

    pointer = &wut; 
    pointer -> get_in_area(); 

我想要做的事情是:在代碼的某些部分,我希望指針是map2。我設法使指針「指針」在類Maps中顯示void get_in_area(),但是當我想在第二個代碼示例中使用somemap指針繪製地圖時,控制檯崩潰。它工作,而不是somemap [我]我把map2 [i]。如果我錯過了任何事情,我很抱歉,我是初學者,英語不是我的第一語言。 我做了這個腳本本教程:https://www.youtube.com/watch?v=7gpH7bOS350

+0

由於您假設數組邊界== 81?一旦未定義的行爲發生崩潰,它會崩潰 – Neijwiert

+0

也在C++中嘗試儘可能避免原始數組,並將它們包裝到類中或使用其中一個現有類來讓這種故障以更好的方式出現,並帶有乾淨的異常 – Neijwiert

+0

I試圖到處編輯81,但它從來沒有幫助過。地圖尺寸不同,最大尺寸爲81x81,所以我只寫了81個地方。感謝您的建議,但代碼示例是在課堂上,我只是沒有粘貼整個代碼 – Pinet

回答

1

這是你將如何創建一個2維數組:

typedef int T; 
void f() 
{ 

    T ** map = new T*[10]; 

    for (int i = 0; i < 10; i++) 
    { 
     map[i] = new T[10]; 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      map[i][j] = i*j; 
     } 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      std::cout << map[i][j] << "\t"; 
     } 
     std::cout << std::endl; 
    } 
} 

這將輸出一個通用的乘法表。

如果你想要更多的維度則只需創建增加一個步驟:

T*** map = new T**[10]; 

for (int i = 0; i < 10; i++) 
{ 
    map[i] = new T*[10]; 
} 
... 
0

你應該學會如何傳遞的,而不是使用全局(map2)或靜態(81)變量參數。如果你聲明:

void Game::showing_different_maps(int n, int m, char map[n][m]) 
{ 
String differentmap= true; 
    while (differentmap) 
    { 
     system("cls"); 
     for(int i = 0; i < n; i++) // i < map2[y][] 
     { 
      cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH! 
     } 

應該不會再崩潰......

但無論如何,對於這個用途,我會用一個指針的指針,而不是一個二維數組:

char *map2[]= { 
    "###^######^###", 
    "#L   #", 
    "^S   #", 
    "#S   #", 
    "# K  #", 
    "########### #", 
    "#G   #", 
    "#  #### #", 
    "#  #M #", 
    "# @  # #", 
    "## ########^##"}; 

然後

void Game::showing_different_maps(int n, char **map) 
+0

非常感謝,我在理解上遇到了一些問題,所以我無法理解以前的幫助,但經過一段時間,我已經設法使用指針指針的指針,但我遇到了另一個問題。應用程序運行,但是當地圖被繪製,並且我按下一個鍵時,它會崩潰。調試器只告訴我這一點:「程序收到信號SIGSEGV,分段錯誤。」從互聯網上我只能理解「你永遠不會分配存儲變量所需的空間」,但我不知道如何處理它。我在我的問題中添加了更多代碼。再次感謝您爲此刻所做的一切。 – Pinet

+0

這不應該是對這個問題的編輯,而是一個新問題,因爲它現在是一個不同的問題,現在的答案現在與這個新的部分無關。 –

+0

哦,好吧,我會提出新的問題,但是謝謝你 – Pinet