0

次のように宣言された関数setPositionがあります。

void setPosition(char ***grid, int a, int b) {
    int x = a / 8;
    int xbit = a % 8;
    int y = b;
    (*grid)[x][y] |= 1 << xbit;
}

そして私のメインでは、私は持っています:

char grid[1000][1000];
setPosition(&grid, 10, 5);

しかし、「警告:互換性のないポインタ型から'setPosition'の引数1を渡す」というメッセージが表示されます。なぜ?

4

2 に答える 2

4

配列は関数に渡されるときにポインターに減衰しますが、配列とポインターは同じタイプではありません。メソッドシグネチャを変更して配列を取得できます

void setPosition(char grid[][1000], Pos *p)

but if you are doing C++, vector<vector<char> > would provide a much better and more flexible option.

于 2012-04-13T00:35:47.437 に答える
2

sizeofまたは 単項演算子のオペランドである場合、または宣言で別の配列を初期化するために使用される文字列リテラルである場合を除き、&型 "N-element array of T" の式は / "decay" に変換 / 置換されます。T値が配列の最初の要素のアドレスである「ポインタ」型の式。

関数を次のように呼び出す場合

setPosition(grid, 10, 5);

gridには typechar [1000][1000]があり、上記の規則により type の式に置き換えられるchar (*)[1000]ため、関数プロトタイプは次のようにする必要があります。

void setPosition(char (*grid)[1000], int a, int b) { ... }

また

void setPosition(char grid[][1000], int a, int b) { ... }

これは、このコンテキストでは同じことです。

関数を次のように呼び出す場合

setPosition(&grid, 10, 5);

&gridには typechar (*)[1000][1000]があるため、関数プロトタイプは次のようにする必要があります

void setPosition(char (*grid)[1000][1000], int a, int b) { ... }

grid次のように、添え字を適用する前に、明示的に逆参照する必要があります。

(*grid)[a][b] = ...;
于 2012-04-13T03:53:20.263 に答える