2016-07-01 4 views
-1

私は、私のマップであるマルチディメンション配列へのポインタを使用しようとしています。したがって、最後のコードでは、すべてのマップでコリジョンを生成する代わりにポインタを使用できます。不幸にも、地図を描いた後、矢印を押して移動すると、プログラムがクラッシュします。 デバッガは、これはマップの一つであるタイトルC++ consoleプログラム受信シグナルSIGSEGV、セグメンテーションフォールト

にあるものだけを私に言った:

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

これは初めである:

マップや移動を示す
 mainmap = false; 
     x = 2; 
     game.showing_different_maps(15, map2); // (y, somemap) 

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

    system("pause>nul");  
    if(GetAsyncKeyState(VK_UP)) 
    { 
     mapki.move(-1, 0); 
    } 
    if(GetAsyncKeyState(VK_DOWN)) 
    { 
     mapki.move(1, 0); 
    } 
    if(GetAsyncKeyState(VK_RIGHT)) 
    { 
     mapki.move(0, 1); 
    } 
    if(GetAsyncKeyState(VK_LEFT)) 
    { 
     mapki.move(0, -1); 
    } 
} 

}

衝突を扱う

スクリプト:

void Maps::move(int V, int H) 
{ 
int y2 = y + V; 
int x2 = x + H; 
if(map2[y][x2] == ' ' 
|| map2[y][x2] == 'K' 
|| map2[y][x2] == 'W') 
{ 
    map2[y][x] = ' '; 
    x += H; 
    map2[y][x] = '@'; 
} 
if(map2[y2][x] == ' ' 
|| map2[y2][x] == 'K' 
|| map2[y2][x] == 'W') 
{ 
    map2[y][x] = ' '; 
    y += V; 
    map2[y][x] = '@'; 
}      

}

私は[] [] [] []、代わりにMAP2のsomemapどこでも書きたかったが、それが動作するかどうか、私はチェックcan`t、 "の理由プログラム受信信号SIGSEGV、セグメンテーションフォルト。クラッシュ。

+1

tl; dr try .. gdb :) LinuxとMingwのウィンドウで 'gdb。/ yourapp'を実行し、実行すると入力してから' bt'を入力するとsegfaultedが表示されます。 ) – nayana

+0

あなたの配列の要素は 'const'文字列を指していて、それらの文字列を変更することは未定義です。コンパイラは 'char *'への非難された変換について警告していたはずです。 – molbdnilo

+0

テストせずにあまりにも多くをやろうとしています。一度に1つの問題を解決してください。まず、描画コードが動作するようにします。クラッシュせずに地図を描画できない場合は、地図をナビゲートすることはできません。加えて、あなたは[mcve]を持っていることに近づきます。 – user4581301

答えて

0

ここでのエラーは、サイズが15であるが、初期化された要素が11個しかないポインタの配列に由来します。つまり、最後の4はNULLに初期化されます。

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

それ自体で、これは無害だろうが、あなた後で使用:

game.showing_different_maps(15, map2); // (y, somemap) 

だからあなたがそうcout << SIGSEGVにヌル文字ポインタを渡して終了実際にMAP2のためのあなたの宣言はこれに等しいです。

あなたは、少なくともここでは、11の代わりに15を初期化配列のサイズを渡す必要があります。

game.showing_different_maps(11, map2); // (y, somemap) 

をしかし、あなたがテストする必要がありますので、私は、あなたがmoveで、後に問題があります疑うこと0 < = Y + V < VMAXおよび0 < = x + H < HMAX(ここではVMAX = 11およびHMAX = 14)。そうでない場合は、文字列や文字列配列の範囲外にアクセスして、未定義のビヘイビアを呼び出すことができます。

+0

あなたは天才ですが、私の問題は解決しましたが、最後のコードサンプルで別のものを作成しました:map2 [y] [x] = '';この行は私に別のSIGSEGVエラーを与えています。もちろん、膨大なスペースと作業量を節約するために、私はそれが同じポインタ "somemap"であることを望みます。救援に近いので、最後の問題です。私は私のプロジェクトに潜入し、私がどのように知っているかをプログラムすることができます。私はこのマップシステムで誇張しています... Btw。私はそのテストをしましたが、正直言って以前は何が起きているかを確認しようとしました、もしy = 0ならば、それは何とかクラッシュせずにこれをやってしまうのを妨げているようです。 – Pinet

+0

実際、私はランダムな方向から地図をエスケープしようとすると、私は常にクラッシュすることなく、目に見えない障壁を満たしています。 (それは私の最後の作業デモにあった) – Pinet

+0

変数を変更したので、明らかにy、xは座標、y1、x1は地図の幅と高さです – Pinet

関連する問題