2012-01-14 12 views
0

多次元配列への転置ポインタを返すには、次の関数を使いたいと思います。多次元配列へのポインタの返却

コード

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 

質問

まさに私が間違っているのは何

、そしてどのように私はこのタスクを達成することができますか?

+3

2D配列の行のみを割り当て、列は割り当てません。カラムのために 'new float [MATRIX3_DIMS]'も必要です。 – iammilind

+4

ここでは複数のことが間違っていますが、 '(* ret)'を 'ret'に置き換える必要があるため構文エラーです.ptr-to-ptrタイプを3回参照解除しようとしていますデリファレンスされた2回。 – mcmcc

+2

@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

答えて

2

retはfloatへのポインタへのポインタです。逆参照すると、(*ret)のように、浮動小数点へのポインタが得られます。インデックスを取るときは、(*ret)[ i ]のように、それはあなたに浮動小数点を与えます。インデックスを取るときは、次のようになります:​​、よく、あなたはフロートのインデックスを作成しようとしています。それは合法ではありません。

このようなコーディングスタイルを脇に置いて、最初に間違っているのは、サブアレイを割り当てていないということです。しかしコンパイラのエラーは、最初の段落で説明したエラーを参照しています。それを修正するためにretの逆参照を削除してください。あなたはこれで終わる:

for (int i = 0; i < MATRIX3_DIMS; i++) 
{ 
    ret[i] = new float[MATRIX3_DIMS]; 
    for (int j = 0; j < MATRIX3_DIMS; j++) 
    { 
     ret[ i ][ j ] = matrix[ i ][ j ]; 
    } 
} 

しかしこれは完全に例外安全ではありません、あなたは適切std::vectorのように、例外安全な方法でメモリを管理するクラスを使用する必要があります。