将指针返回到多维数组

时间:2012-01-14 05:01:34

标签: c++ pointers multidimensional-array return-value

我想使用以下函数将转置指针返回到多维数组。

代码

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)并循环通过,将本地数组的每个成员 - 矩阵 - 分配给ret指针数组。

我收到的错误如下:

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

问题

我究竟做错了什么,我该如何完成这项任务?

1 个答案:

答案 0 :(得分:2)

ret是指向float的指针。当你取消引用它时,就像这样:(*ret),你会得到一个浮点指针。当您对其进行索引时,如下所示:( *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