6

私はこのような機能を持っています:

void findScarf1(bool ** matrix, int m, int n, int radius, int connectivity); 

メイン関数では、この関数に渡す 2D 動的配列を作成します

    bool matrix[6][7] = {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0}
};

問題は:

findScarf1(matrix, 6, 7, 3, 4);

エラー C2664 の原因 : 'findScarf1' : パラメーター 1 を 'bool [6][7]' から 'bool **' に変換できません

配列をコンパクトに初期化する方法(宣言と同時に)?

ps重複した質問の場合は申し訳ありませんが、私はそれを理解するのに1.5時間費やしました

4

4 に答える 4

3

配列がメモリ内でどのように配置されているかを見て、ポインターからポインターへの「マトリックス」がどのように配置されているかを比較すると、マトリックスをポインターからポインターとして渡すことができない理由が理解できます。

あなたのマトリックスは次のようなものです:

[ マトリックス[0][0] | 行列[0][1] | ... | 行列[0][6] | 行列[1][0] | 行列[1][1] | ... ]

ポインターツーポインターの行列は次のようになります。

[ 行列[0] | 行列[1] | ... ]
  | | | |
  | | v
  | | [ 行列[1][0] | 行列[1][1] | ... ]
  v
  [ マトリックス[0][0] | 行列[0][1] | ... ]

これは、関数の引数を変更することで解決できます。

bool (*matrix)[7]

これにより、引数matrixが配列へのポインターになり、機能します。


ちなみに、matrixあなたが持っている変数は動的ではなく、コンパイラによって完全に宣言および初期化されており、動的なものは何もありません。

于 2013-07-10T09:16:30.443 に答える
2

技術的には、2D 配列は 1D 配列の配列です。したがって、ポインタからポインタへの変換はできません。ただし、 array へのポインタに変換できます。

したがって、これは機能するはずです:

void findScarf1(bool (*matrix)[7], int m, int n, int radius, int connectivity); 

ここでは、7 bool の配列へbool (*matrix)[7]のポインターを宣言します。

それが役立つことを願っています。

于 2013-07-10T09:15:50.637 に答える
1

関数は次のように定義できます。

void findScarf1(bool * matrix, int m, int n, int radius, int connectivity);

または

void findScarf1(bool matrix[][7], int m, int n, int radius, int connectivity);

配列の次元数に関係なく、それは単なる線形メモリのブロックです。

最初の方法を使用する場合、この関数を呼び出すときにキャストを行う必要がある場合があります。

findScarf1((bool *)marix, 6, 7, 3, 4);
于 2013-07-10T09:12:18.050 に答える
1

私の次の例はあなたに役立つかもしれません:

#include<stdio.h>
void f(int (*m)[7]){  // As Nawaz answred
 printf("%d\n", m[3][3]);

}
void _f(int m[6][7]){ // As I commented to your question
 printf("%d\n", m[3][3]);

}
void _f_(int m[][7]){// Second form of Nawaz's answe 
 printf("%d\n", m[3][3]);

}
void f_(int (*m)[6][7]){// Pointer of 2D array
 printf("%d\n", (*m)[3][3]);
}

int main(){

    int matrix[6][7] = {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 3, 1, 0, 0},
    {0, 0, 1, 4, 1, 0, 0},
    {0, 0, 1, 5, 1, 0, 0},
    {0, 0, 1, 6, 1, 0, 0},
    {0, 0, 1, 7, 1, 0, 0}
    };
    f(matrix);
    _f(matrix);
    _f_(matrix);    
    f_(&matrix);
    return 1;
}    

質問はcに触れていませんが、gccでコンパイルしました(g ++をインストールしていません)。

~$ gcc  -Wall -pedantic 2d.c
~$ ./a.out 
5
5
5
5

回答を投稿するつもりはありませんでしたが、ナワズの回答に間違ってコメントしたため、実験中にこのコードを書きました。

ここでは、codepacdeで動作していることがわかります

于 2013-07-10T09:57:27.380 に答える