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。
我正在尝试 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。