2

次のコードがあります。

void getPossibilities(int *rating[200][3]){
// do something
}

int main ()
{
int rating[200][3];
getPossibilities(&rating);
}

これにより、次のエラー メッセージがスローされます。

エラー: 引数 1 の int ( )[200][3] を int ( )[3] に変換して getPossibilities(int (*)[3]) を無効にすることはできません

4

3 に答える 3

5

関数のシグネチャは次のようになります。

void getPossibilities(int (*rating)[3]);

引数を次のように渡します。

getPossibilities(rating);

変数は、形式の型に崩壊できるrating形式の 2 次元配列です。だから私はそれがあなたが望むすべてだと思います。T[M][N]T(*)[N]

上記のソリューションのように、配列は減衰し、1 つの次元のサイズが失われます (N確実に知っている関数でMは、配列の減衰による損失だけです)。そのため、関数のシグネチャを変更して減衰を回避する必要があります。配列:

void getPossibilities(int (&rating)[200][3]) //note : &, 200, 3
{
  //your code
}

//pass argument as before
getPossibilities(rating);  //same as above

さらに良いのは、テンプレートを次のように使用することです。

 template<size_t M, size_t N>
 void getPossibilities(int (&rating)[M][N])
 {
       //you can use M and N here
       //for example
       for(size_t i = 0 ; i < M ; ++i)
       {
          for(size_t j = 0 ; j < N ; ++j)
          {
             //use rating[i][j]
          }    
       }
 }

この関数を使用するには、前と同じように引数を渡す必要があります。

 getPossibilities(rating); //same as before!
于 2012-04-24T11:52:03.580 に答える
0

N 次元の配列を関数に渡す場合、0 番目の次元は常に無視されます。a[N]に減衰するのはそのため*pです。同様に、 にa[N][M]減衰し(*p)[M]ます。
ここでは、要素(*p)[M]の配列へのポインターです。M

int a1[N][M], a2[M];
int (*p)[M];
p = a1; // array a1[N][M] decays to a pointer
p = &a2; // p is a pointer to int[M]

したがって、関数の署名は次のようになります。

void getPossibilities(int (*rating)[3]);

C++ を使用しているため、参照によって配列を渡すことができる機能を利用する価値があります。したがって、好ましい方法は次のとおりです。

void getPossibilities(int (&rating)[200][3]);
于 2012-04-24T12:05:22.577 に答える
0

との間には違いがint (*x)[200][3]ありますint *x[200][3]

于 2012-04-24T11:54:14.020 に答える