-1

疑問があります。

私は3列を持つことがわかっているマトリックスを持っていますが、行数はマトリックスを格納するクラスのコンストラクターで定義されます。次に、変数を次のように宣言します

int * ColorsYUV[3];

しかし、mallocを使用して割り当てようとしたとき:

ColorsYUV = (int *) malloc(sizeof(T) * 8 * sizeof(int) * 3);

次のエラーが表示されます。

incompatible types in assignment of ‘int*’ to ‘int* [3]’

どうすればその問題を解決できますか。私が認識している唯一のアイデアは、単純なベクトルを使用し、0 から 2 までの「for」ループを追加してそれにアクセスすることですが、可能であれば行列のようなアクセスを好みます。

ColorsYUV[i][0]...
ColorsYUV[i][1]...
ColorsYUV[i][2]...

私は自分自身を説明したいと思います...前もって感謝します。

4

3 に答える 3

2

まず、ogni42 が言うように、実際には std::vector<std::array<int, 3>>;を使用する必要があります。C++11 がない場合は、boost::array代わりにstd::array. そうではなく、実際に C++ ではなく C を使用している場合:

int* ColorsYUV[3];

3 つのポインターの配列を宣言します。あなたが望むものは:

int (*ColorsYUV)[3];

これは、3 つの配列へのポインターです。

それから、私はあなたの malloc を理解していません: どこsizeof(T) に入るか: 8 x 3 の行列を割り当てたい場合:

ColorsYUV = (int (*)[3])malloc( 8 * 3 * sizeof(int) );

キャストでポインターの型を複製する必要があることに注意してください。ColorsYUVは ではないためint*、 の戻り値をmallocto にキャストしてint*もうまくいきません。(もちろん、C を使用している場合は、他の人が行っていることを行うだけで、キャストを完全に削除できます。C では、 void*任意のオブジェクト ポインター型への暗黙的な変換が可能です。)

于 2013-07-30T10:26:03.343 に答える
0

まず第一に: C++ の場合は、std::vector<array<int, 3>>. 配列アクセス[][]とメモリ管理を無料で利用できます。

C スタイルのままで問題を解決したい場合は、キャストを正しい型に修正する必要があります

于 2013-07-30T10:17:38.027 に答える
0

最初にポインター配列 (列) を宣言します。

 int (*ColorsYUV)[3];

次に、「for」ループを使用してメモリを割り当てます。これは、配列全体ではなく、一度に 1 つのポインターがメモリーアドレスを指すことができるように使用されます。行数 = 8 とすると、

  int no_of_rows = 8; //value set as an example
  for (i=0;i<3;i++)
  {
     ColorsYUV[i] = (int *) malloc(sizeof(int) * no_of_rows);
  }

うまくいけば、今はエラーが発生しません。

于 2013-07-30T10:53:08.240 に答える