Возвращение указателя на многомерный массив - PullRequest
0 голосов
/ 14 января 2012

Я хотел бы использовать следующую функцию для возврата транспонированного указателя на многомерный массив.

Код

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;

}

Описание

Как показано, я объявляю многомерный массив с использованием синтаксиса инициализации (используя матрицу члена класса - mMatrix - для создания транспонированной версии самой матрицы. Затем я назначаю многомерный указатель на массив (ret)и выполнить цикл, присваивая каждый элемент локального массива - матрицы - массиву указателей повтора.

Я получаю следующую ошибку:

error: invalid types ‘float[int]’ for array subscript

Вопрос

Что именно я делаю неправильно и как я могу выполнить эту задачу?

1 Ответ

2 голосов
/ 14 января 2012

ret - указатель на указатель на число с плавающей точкой. Когда вы разыменовываете это, как это: (*ret), вы получаете указатель для float. Когда вы берете индекс по этому, например: ( *ret )[ i ], это дает вам число с плавающей точкой. Когда вы берете индекс по этому, например так: ( *ret )[ i ][ j ], ну, вы пытаетесь индексировать с плавающей запятой. Это не законно.

Если отбросить мое отвращение к этому стилю кодирования, первое, что вы делаете неправильно, это то, что вы не выделяете под-массивы. Однако ошибка компилятора относится к ошибке, проиллюстрированной в первом абзаце. Просто удалите разыменование 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.

...