错误:无法使用“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】:

您正试图返回指向该函数内的临时变量的指针。 返回函数后,编译器会自动清理该变量。

此外,您正在尝试创建一个堆栈分配的数组,其参数在编译时未知,如果您在编译时有数组的大小,则可以将 rc 标记为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”类型的参数

无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象

函数类型的左值是不是是可修改的左值?

条件运算符中的“错误:需要左值作为赋值的左操作数”

绑定 T&& 类型的左值表达式