2016-08-18 39 views
1

我想获取行数的数据,但指针CvMat* data, CvMat* responsesmain()中什么也没有。最小,完整,varifiable例子显示如下:指针无法获取数据

#include "opencv2/core/core_c.h" 
#include "opencv2/ml/ml.hpp" 

#include <cstdio> 
#include <fstream> 
#include <iomanip> 

#define ATTRIBUTES_PER_SAMPLE 9 
#define NUM_OF_ALL_SAMPLES 950 

using namespace std; 

int read_data(CvMat* data, CvMat* responses) 
{ 
    float temp=1.0; 

    data = cvCreateMat(NUM_OF_ALL_SAMPLES, ATTRIBUTES_PER_SAMPLE, CV_32F); 
    responses = cvCreateMat(NUM_OF_ALL_SAMPLES, 1, CV_32F); 

    for(int line = 0; line < NUM_OF_ALL_SAMPLES; line++) 
     for(int attribute = 0; attribute <= ATTRIBUTES_PER_SAMPLE ; attribute++){ 

      if(attribute < ATTRIBUTES_PER_SAMPLE){ 
       CV_MAT_ELEM(*data, float, line, attribute) = temp; 
      } 
      else if(attribute == ATTRIBUTES_PER_SAMPLE){ 
       CV_MAT_ELEM(*responses, float, line, 0) = temp; 
      } 

     } 


    return 1; 
} 

/////////////////////////////////////////////////////////////////////////// 
int main() 
{ 
    CvMat* data = 0; 
    CvMat* responses = 0; 

    int ok = read_data(data, responses); 

    int nsamples_all = data->rows; // <--------- error happens here 

    cvReleaseMat(&data); 
    cvReleaseMat(&responses); 

    return 0; 
    return 0; 
} 

的错误是在0x013715c2在opencv_pointer.exe

未处理的异常:0000005: 访问冲突读取位置0x00000014。

我的编译器是VS2008。为什么指针CvMat* data, CvMat* responses什么都得不到?

回答

1

通过传递的参数复制所以在函数指针CvMat* data是你主要在传递指针的副本。您对其做出的任何更改都是该函数的本地功能。当您使用cvCreateMat()为其分配值时,该值不反映回main()中的CvMat* data,因此当函数返回时它会丢失。

如果您想更改参数要“回传”你需要通过参考在指针经过:

// pass variables by reference using & 
int read_data(CvMat*& data, CvMat*& responses) 

现在改变为函数内部的参数进行发生的变量,你从函数外部传入 - 指针不被复制,它们被引用。

1

因为参数是按值传递的。您可以使用参考有被叫修改主叫方的局部变量这样(加&):

int read_data(CvMat*& data, CvMat*& responses) 
{ 
    // the same code 
} 
1

参数dataresponses被宣布为按值传递,这意味着对自己的任何修改(不是指针对象)内部read_data()不会影响main()中的变量,它们的值仍然是初始化值0

您可以更改参数类型以通过引用传递(或通过指针传递,相关代码需要对其进行调整)。

int read_data(CvMat*& data, CvMat*& responses) 
        ~    ~ 
{ 
    ... 
}