多次元配列への転置ポインタを返すには、次の関数を使いたいと思います。多次元配列へのポインタの返却
コード
float** Matrix3f::Transpose(void)
{
float matrix[MATRIX3_DIMS][MATRIX3_DIMS] =
{
{ mMatrix[ 0 ][ 0 ], mMatrix[ 1 ][ 0 ], mMatrix[ 2 ][ 0 ] },
{ mMatrix[ 0 ][ 1 ], mMatrix[ 1 ][ 1 ], mMatrix[ 2 ][ 1 ] },
{ mMatrix[ 0 ][ 2 ], mMatrix[ 1 ][ 2 ], mMatrix[ 2 ][ 2 ] }
};
float** ret = new float*[ MATRIX3_DIMS ];
for (int i = 0; i < MATRIX3_DIMS; i++)
{
for (int j = 0; j < MATRIX3_DIMS; j++)
{
(*ret)[ i ][ j ] = matrix[ i ][ j ];
}
}
return ret;
}
説明
示すように、Iは、クラスメンバのマトリックスを使用して(初期化構文を使用して多次元配列を宣言 - mMatrix - 行列の転置バージョンを作成しますローカル配列 - 行列 - の各メンバーをretポインタ配列に代入して、配列(ret)とループスルーに多次元ポインタを割り当てます。
私が受け取るエラーは以下の通りです:
error: invalid types ‘float[int]’ for array subscript
質問
まさに私が間違っているのは何、そしてどのように私はこのタスクを達成することができますか?
2D配列の行のみを割り当て、列は割り当てません。カラムのために 'new float [MATRIX3_DIMS]'も必要です。 – iammilind
ここでは複数のことが間違っていますが、 '(* ret)'を 'ret'に置き換える必要があるため構文エラーです.ptr-to-ptrタイプを3回参照解除しようとしていますデリファレンスされた2回。 – mcmcc
@iammilindまた '(* ret)[i] [j]'は 'float **'を3回デリファレンスします。 'ret'は' float ** '、' * ret'は 'float *'で、 '(* ret)[i]'は 'float'です。 'float f;を実行することはできません。 f [0]; 'しかし、それは基本的にあなたがしていることと、コンパイラが何を不満しているかです。また、 'new float [height * width]'で行列を割り当て、 'mat [i%width + j * width]'でアクセスするか、小さなラッパークラスを記述し、添え字演算子をオーバーライドすることをお勧めします。 – PeterT