2017-06-19 14 views
-1

2D配列を関数に渡したいと思います。私は3つの関数を書いた:2D配列を関数に渡す:ゼロ値と印刷の問題

  • すべての値を== 0;
  • これを望ましい値で実装します。
  • プリントマトリックス;

出力が間違っています。私はmapZeroが正しく動作することをデバッグモードでチェックしました(すべての行とカラムでゼロを実装しますが)。最初の行列は0の値で構成されなければならず、2番目の行列は実装されています(btw、なぜmapInitのコメント付きコードを構築できないのですか? 3番目の行列は私のアルゴリズムで実装された新しい行列です(私は最後の点まで最短の方法を見つけるためにwave-algorithmを書いています)。

ポインタを使用する方法と場所(多分問題がありますか?)と正しい方法で幅と高さを渡す方法がわかりません。

enter image description here

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

int mapPrint(int map[WIDTH][HEIGHT]) 
{ 
    for (int i = 0; i < WIDTH; ++i) 
    { 
     for (int j = 0; j < HEIGHT; ++j) 
     { 
      printf("%2d ", map[i][j]); 
     } 
     printf("\n\n"); 
    } 
    printf("\n"); 
    return 0; 
} 

int mapInit(int * map[WIDTH][WIDTH]) 
{ 
    /* 
    map[WIDTH][WIDTH] = 
    { 
     { 127,1,1,1,1,1,1, 1 }, 
     { 0, 1,0,0,0,1,1, 1 }, 
     { 1, 1,1,1,0,0,0, 1 }, 
     { 1, 0,0,1,0,0,0, 1 }, 
     { 1, 0,1,1,0,0,1, 1 }, 
     { 1, 1,1,1,1,1,1, 1 }, 
     { 0, 1,0,0,1,0,1, 1 }, 
     { 1, 1,1,1,1,1,1,255 }, 
    }; 
    */ 

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

    for (int j = 0; j < WIDTH; ++j) 
    { 
     map[0][j] = 1; 
     map[7][j] = 1; 
     map[j][7] = 1; 
     map[5][j] = 1; 
    } 

    for (int j = 2; j < 5; ++j) 
    { 
     map[j][0] = 1; 
    } 

    map[1][1] = 1; map[1][5] = 1; map[1][6] = 1; 
    map[2][1] = 1; map[2][2] = 1; map[2][3] = 1; 
    map[3][3] = 1; 
    map[4][2] = 1; map[4][3] = 1; map[4][6] = 1; 
    map[6][1] = 1; map[6][4] = 1; map[6][6] = 1; map[6][7] = 1; 
    map[0][0] = 22; 
    map[7][7] = 99; 

    return 0; 
} 

私のmain.c:

#include <stdbool.h> 
#include <stdlib.h> 
#include <stdio.h> 

#define WIDTH 8 
#define HEIGHT 8 

int mapZero(int * map[WIDTH][WIDTH]); 
int mapPrint(int map[WIDTH][HEIGHT]); 
int mapInit(int * map[WIDTH][WIDTH]); 

int main(int argc, char * argv[]) 
{ 
    short int map[WIDTH][HEIGHT]; 
    short int visited[WIDTH][HEIGHT]; 

    mapZero(visited); 
    mapZero(map); 
    mapInit(map, WIDTH, HEIGHT); 

    printf("Matrix of zeroed-visited cells:\n\n"); 
    mapPrint(visited, WIDTH, HEIGHT); 
    printf("Matrix of the map:\n\n"); 
    mapPrint(map, WIDTH, HEIGHT); 

    return 0; 
} 
+0

コンパイラの警告を無視する理由は何ですか?デバッグの問題について質問する前に、推奨される警告を有効にして修正する必要があります。そして[ask]を読んでください。 – Olaf

+0

あなたの投稿を壊さないでください。質問を投稿したら、(CC-by-SAライセンスのもとで)大規模なスタックオーバーフローコミュニティにコンテンツのライセンスを取得しました。この投稿とアカウントとの関連付けを解除する場合は、[disassociation requestの正しいルートは何ですか?](http://meta.stackoverflow。com/questions/323395/diss-is-a-dissociation-request-for-the-dissociation-request)が含まれています。 – Bugs

答えて

1

引数宣言int * map[WIDTH][WIDTH]int * (*map)[WIDTH]に等しいです。これは、ポインタの配列配列intです。配列short intの配列を渡します。

アスタリスクを削除し、引数に正しいタイプを使用し、正しい記号定数:short int map[WIDTH][HEIGHT]を使用します。

また、mapInitmapPrintには、宣言されていない2つの引数があります。

コンパイラはすべてについて不平を言っているはずです。

+0

ありがとうございました!私はmain()の配列をどのように宣言したかに注目しなかった。今それは正しいです。 しかし、私はまだmapInit()のコメントに表示されている方法で配列を実装できない理由に興味があります –

+1

@GeorgeZ。なぜなら、Cで有効な構文ではないからです。*配列に*を割り当てることはできません。配列を初期化したり、個々の要素に割り当てたり、コピーしたりすることはできません。 2番目の方法では、 'mapInit'関数で必要に応じて初期化された配列を作成し、[memcpy'](http://en.cppreference.com/w/c/string/byte/memcpy)からそれを 'map'にします。 –

1

int * map[WIDTH][WIDTH]は、ポインタの配列です。呼び出し元の配列と互換性がないため、コードをコンパイルしないでください。これをint map[WIDTH][WIDTH]に変更します。

同様に、shortの配列は、intの配列と必ずしも互換性がありません。どこでも同じタイプを使用してください。

あなたのコードがエラー/警告なしでコンパイルされた場合、コンパイラには何か問題があります。

配列パラメータ調整( "decay")の規則により、上記の配列宣言は、パラメータリストの一部がコンパイラによって最初の要素へのポインタに調整されます。 2D配列の最初の要素は1D配列であるため、1D配列への配列ポインタint (*)[WIDTH]に調整されます。