错误:无法使用“int [r][c]”类型的左值初始化“int *”类型的返回对象
Posted
技术标签:
【中文标题】错误:无法使用“int [r][c]”类型的左值初始化“int *”类型的返回对象【英文标题】:Error: Cannot initialize return object of type "int *" with an lvalue of type 'int [r][c]' 【发布时间】:2021-02-22 05:44:52 【问题描述】:我正在尝试在 XCode 项目中构建一些 .cpp 代码。我有一个非常简单的函数,可以将数据类型 cv::Mat(来自 opencv)的矩阵转换为简单的二维 c++ 数组。
函数看起来像这样:
int* myClass::convertMatrix(cv::Mat cvmat)
int r = cvmat.rows;
int c = cvmat.cols;
int newmat[r][c];
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
newmat[i][j] = cvmat.at<int>(i, j);
return newmat;
我不知道出了什么问题。我知道“左值”指的是特定的内存位置,但这与我返回矩阵有什么关系?
【问题讨论】:
你为什么不直接使用std::vector
?
我在前端传递要由 swift 处理的数据,所以我想让事情尽可能简单。
在这种情况下,只需将newmat
设为一维数组。但更重要的是newmat
会在函数结束时被销毁。
那我需要动态分配内存吗?
如果你真的想从函数中返回一个数组,是的。但你必须在使用后释放它。
【参考方案1】:
您正试图返回指向该函数内的临时变量的指针。 返回函数后,编译器会自动清理该变量。
此外,您正在尝试创建一个堆栈分配的数组,其参数在编译时未知,如果您在编译时有数组的大小,则可以将 r
和 c
标记为constexpr
,如果它没有抱怨,请考虑阅读 VLA。
要解决这些问题,只需在堆上分配数组:
int** make_2d_array(int r, int c)
int** arr = new int*[r];
for(int i = 0; i < r; i++)
arr[i] = new int[c];
return arr;
int** myClass::convertMatrix(cv::Mat cvmat)
int r = cvmat.rows;
int c = cvmat.cols;
int** newmat = make_2d_array(r, c);
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
newmat[i][j] = cvmat.at<int>(i, j);
return newmat;
当你停止使用数组时不要忘记删除它。
我还建议考虑使用std::vector
,这样您就不必担心删除数组(更简单):
std::vector<std::vector<int>> newmat(r, std::vector<int>(c));
【讨论】:
以上是关于错误:无法使用“int [r][c]”类型的左值初始化“int *”类型的返回对象的主要内容,如果未能解决你的问题,请参考以下文章
无法使用“Shape *”类型的左值初始化“Shape Shape::*”类型的返回对象
无法使用 double 类型的左值初始化“id _NonNull”类型的参数