2016-06-30 4 views
1

解決策を探していましたが、エラーなしで使用することはできませんでした。 多次元配列を使用してコンソールにマップを描画しようとしています。私はもっ​​と多くの地図を持っていたいが、役に立たないコードをスパムすることなくそれをすることはできない。これは、マップです:多次元配列ポインタを使用しようとしています

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にしたいということです。私はクラスマップでvoid get_in_area()を表示するためにポインタ "ポインタ"を作成することができましたが、2番目のコードサンプルにsomemapポインタを使ってマップを描画したいときにコンソールがクラッシュします。 somemap [i]の代わりにmap2 [i]を置くとうまくいきます。私が何かを見逃してしまったらすみません、私は初心者で、英語は母国語ではありません。 私はこのチュートリアルでこのスクリプトを作っ:https://www.youtube.com/watch?v=7gpH7bOS350

+0

あなたは配列の境界== 81を仮定していますか?定義されていない振る舞いが起こると直ちにクラッシュします。 – Neijwiert

+0

も可能です。生の配列をできるだけ避けて、クラス内でラップしたり、既存のクラスを使用してクリーンな例外でよりうまくできないようにしてください。 – Neijwiert

+0

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! 
     } 

を、あなたは、もはや...

をクラッシュさせるべきではありません。しかし、いずれにせよ、この使用のために、私は2次元配列の代わりにポインタへのポインタを使用します。

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

そして、

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

ありがとう、私は理解にいくつかの問題を抱えていたので、私は以前の助けを理解できませんでしたが、かなり時間がたって、ポインタアドバイスへのポインタを使用することができました。アプリケーションは実行されますが、マップがペイントされてキーを押すとクラッシュします。デバッガはこれだけを教えてくれました:「プログラムが受け取った信号SIGSEGV、Segmentation fault」。インターネットからは、「変数を格納するために必要な領域を割り当てない」ということだけを理解していましたが、どうしたらよいか分かりません。私は私の質問にさらにコードを追加しました。この瞬間にやったことをもう一度ありがとう。 – Pinet

+0

これはこの問題の編集ではなく、新しい質問です。なぜなら、これは現在異なる問題であり、現在の回答はこの新しい部分とは無関係であるからです。 –

+0

ああ、大丈夫、私は新しい質問をするつもりですが、にもかかわらずありがとう – Pinet

関連する問題