C ++返回值类型与函数类型不匹配

时间:2015-01-11 21:46:28

标签: c++ matrix

我正在尝试返回一个矩阵,并且在方法中它给出了错误:返回值类型与函数类型不匹配。

这是矩阵:

float obstaculos[20][4];

以下是方法:

float** getObstaculos() {
    return obstaculos;
}

你知道问题是什么吗?

2 个答案:

答案 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。