【问题标题】:why can't I return local variable?为什么我不能返回局部变量?
【发布时间】:2015-03-07 02:12:16
【问题描述】:

不知道为什么c++的规则说不能返回局部变量?

这个简单的“max”函数完全没有问题;

int max(int a,int b)
{
    int maxnum;
    if(a>b)maxnum= a;
    else maxnum= b;
    return maxnum;
}
int main( int argc, char** argv )
{
    cout<<max(10,30);
    system("PAUSE");
    return 0;
}

但是,当我想在opencv中像以前一样返回局部变量时,结果却是错误的数据

为什么这里不能返回局部变量?

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <sstream>
using namespace cv;
using namespace std;

Mat GetIntensity(Mat *pic,int y,int x)
{
    float Array[6];
    for(int i=0;i<6;i++)
    {
        Array[i]=pic[i].at<uchar>(y,x);
    }
    Mat Intensity(6,1,CV_32FC1,&Array);
    cout<<Intensity;
    return Intensity;
}

int main( int argc, char** argv )
{
    stringstream ss;
    string pic_name;
    Mat pic[6];
    for(int i=0;i<6;i++)
    {
        ss.clear();
        ss.str(std::string());
        ss<<"pic"<<i<<".bmp"<<endl;
        ss>>pic_name;
        pic[i] = imread(pic_name, CV_LOAD_IMAGE_GRAYSCALE);
        if(! pic[i].data )
        {// Check for invalid input
            cout <<  "Could not open or find the image" << endl ;
            system("pause");
            return -1;
        }
        //namedWindow( pic_name, CV_WINDOW_AUTOSIZE );
        // Create a window for display.
        //imshow(pic_name, pic[i] );
    }
    cout<<=GetIntensity(pic,60,60);

    system("PAUSE");
    //waitKey(0);
    return 0;
}

【问题讨论】:

  • 您是否尝试过在 Google 上“返回局部变量 c++”?
  • 我做到了,但我不知道为什么这个简单的“max”函数完全没有问题。
  • 我们可以通过值或引用来获取函数返回的数据,但是,在我看来,“按值返回”的意思是“返回本地值”,我想知道为什么它可以在没有 porobleml 的情况下工作?

标签: function opencv return local-variables


【解决方案1】:

您的构造在这里使用本地数组来保存值。一旦您的 Mat 离开范围,这将变得无效:

Mat GetIntensity(Mat *pic,int y,int x)
{
    float Array[6]; //problem
    for(int i=0;i<6;i++)
    {
        Array[i]=pic[i].at<uchar>(y,x);
    }
    Mat Intensity(6,1,CV_32FC1,&Array); // problem
    cout<<Intensity;
    return Intensity;
}

最好用 它自己的数据创建一个 Mat:

Mat GetIntensity(Mat *pic,int y,int x)
{
    Mat Intensity(6,1,CV_32FC1); // no problem
    for(int i=0;i<6;i++)
    {
        Intensity.at<float>(i) = pic[i].at<uchar>(y,x);
    }
    cout<<Intensity;
    return Intensity;
}

【讨论】: