我有一个函数,它接受一个指向浮点数组的指针。基于其他条件,我知道指针实际上指向一个2x2或3x3的矩阵。(实际上内存最初是这样分配的,例如float M[2][2])重要的是我想在函数体中做出这个决定,而不是作为函数参数。
void calcMatrix( int face, float * matrixReturnAsArray )
{
// Here, I would much rather work in natural matrix notation
if( is2x2 )
{
// ### cast matrixReturnAsArray to somethingAsMatrix[2][2]
somethingAsMatrix[0][1] = 2.002;
// etc..
}
else if(is3x3)
{ //etc...
}
}
字符串
我知道我可以使用模板和其他技术来更好地解决这个问题。我的问题是如何在#注解中进行这样的转换。在C++中工作。
4条答案
按热度按时间ht4b089n1#
字符串
z5btuh9x2#
float *
可以指向浮点数组的第一个元素,并且应该是reinterpret_castable到该数组类型。该转换的结果可以指向float [][]
的第一个元素,因此应该是reinterpret_castable到该类型,等等。您应该能够组合这样的转换,然后直接执行字符串
float **
类型的参数是不一样的,不应该这样使用。为了避免未定义的行为,指针必须来自实际的多维数组,如果直接使用
float*
,则只能访问多维矩阵的第一行。型
给定
float arr[2][2];
,没有什么能保证&arr[0][1] + 1
与&arr[1][0]
相同,就我所能确定的而言。所以尽管你可以通过执行f[i*width + j]
来将一维数组用作多维数组,但你不能将多维数组视为一维数组。最好使用C++的编译时类型安全,而不是仅仅依赖于不意外地传递错误的东西或执行错误的reinterpret_cast。为了使用raw-arrays获得类型安全,你应该使用对你想要的raw数组类型的引用:
型
如果你想通过值传递数组,你不能使用原始数组,而应该使用像std::array这样的东西:
型
svdrlsy43#
这种类型的类型转换总是更干净,更容易处理,并明智地使用typedef:
字符串
如果这是C++而不是C,你应该创建一个矩阵类(或者更好的是,寻找一个开源类)。
pobjuy324#
如果我是对的:
字符串
或
型
在C语言中,只有指针的方式
型
并通过以下方式访问:
型