C++ Return 值类型与函数类型不匹配

C++ Return value type does not match the function type

我正在尝试 return 一个矩阵,但在方法中出现错误:Return 值类型与函数类型不匹配。

这是矩阵:

float obstaculos[20][4];

方法如下:

float** getObstaculos() {
    return obstaculos;
}

您知道问题出在哪里吗?

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;
}

虽然 float*float[N]相似的 类型(它们可以以类似的方式使用,并且第一个可以隐式地从第二),但这不适用于 嵌套数组 .

为什么会这样?

类型float**是指向指针的指针。当你像二维数组/矩阵一样使用它时(应用了两个下标运算符),第一个指针应该指向一个 array of pointers 指向更多数组(例如个人行)。

但是,float[N][M] 是整个矩阵的 连续 内存块。没有(行)指针数组,并且 none 可以通过转换为 float** 隐式创建,因此标准不可能进行这种转换。

你能做什么?

您可以return 对多维数组的引用。为此,首先为您的矩阵创建一个 typedef:typedef float matrix[20][4]; 然后使用 return 类型 matrix&

避免嵌套数组。使用一维数组并在访问时计算索引(例如 matrix[row * N + col] 而不是 matrix[row][col])。将此索引计算隐藏在矩阵 class 中,其中 return 是第一个 operator[].

的辅助对象

更好:使用线性代数库处理矩阵,例如 Eigen。