我正在尝试返回一个矩阵,并且在方法中它给出了错误:返回值类型与函数类型不匹配。
这是矩阵:
float obstaculos[20][4];
以下是方法:
float** getObstaculos() {
return obstaculos;
}
你知道问题是什么吗?
答案 0 :(得分:1)
float obstaculos[20][4];
...是一组float
值的数组。由于sizeof
要求,它在内存中是float
值的连续序列。
float**
...是指向float
指针的指针。 float
值的单个序列(obstaculos
矩阵)可以自然地转换为直接指针(即第一个项目),但是没有指针存储在该内存中,您可以获得指向指向。
所以,一种可能性就是
using Row = float[4];
Row obstaculos[20];
Row* getObstaculos() {
return obstaculos;
}
但最好定义一个矩阵,例如
#include <array>
using Row = std::array<float, 4>;
using Matrix = std::array<Row, 20>;
Matrix obstaculos;
Matrix* getObstaculos() {
return &obstaculos;
}
如果你真的需要一个指针数组,那么你可能想要创建最初那个表格的矩阵。
修订: 如果需要,这是计算行指针数组的一种方法:
using Row_data_pointers = std::array<float*, std::tuple_size<Matrix>::value>;
auto data_pointers( Matrix& m )
-> Row_data_pointers
{
Row_data_pointers result;
for( int i = 0; i < int( std::tuple_size<Row_data_pointers>::value ); ++i )
{
result[i] = &m[i][0];
}
return result;
}
答案 1 :(得分:0)
虽然float*
和float[N]
是类似的类型(它们可以以类似的方式使用,第一个可以从第二个隐式初始化),但是这个不适用于嵌套数组。
类型float**
是指向指针的指针。当你像2D数组/矩阵一样使用它时(应用了两个下标运算符),第一个指针应指向指针数组,它指向更多数组(例如指向各个行)。
但是,float[N][M]
是整个矩阵的连续内存块。没有(行)指针数组,并且不能通过强制转换为float**
来隐式创建,因此标准无法进行此转换。
您可以返回对多维数组的引用。为此,首先为矩阵创建一个typedef:typedef float matrix[20][4];
然后使用返回类型matrix&
或避免嵌套数组。使用一维数组并在访问时计算索引(例如matrix[row * N + col]
而不是matrix[row][col]
)。将此索引计算隐藏在矩阵类中,该矩阵类返回第一个operator[]
的辅助对象。
更好:使用线性代数库来处理矩阵,例如Eigen。