2016-08-18 87 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) 
        ~    ~ 
{ 
    ... 
}