我想使用以下函数将转置指针返回到多维数组。
代码
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
问题
我究竟做错了什么,我该如何完成这项任务?
答案 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
。