2015-03-07 4 views
-1

Я не знаю, почему в правиле 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; 
} 
+0

Пробовали ли вы «вернуть локальную переменную C++» на Google? – Telokis

+0

Я сделал, но я не знаю, почему эта простая функция «max» полностью не имеет проблем. – user3094631

+0

мы можем получить данные, возвращаемые функцией, либо по значению, либо по ссылке, но, на мой взгляд, «return by value» означает «return local value», и мне интересно, почему он работает без porobleml? – user3094631

ответ

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