簡體   English   中英

指針無法獲取數據

[英]Pointer can't get data

我想得到數據的行數,但指針CvMat* data, CvMat* responsesmain()什么也得不到。 最小,完整和可變的示例如下所示:

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

錯誤是

opencv_pointer.exe中0x013715c2處的未處理異常:0xC0000005:訪問沖突讀取位置0x00000014。

我的編譯器是VS2008。 為什么指針CvMat* data, CvMat* responses什么都沒得到?

因為參數是按值傳遞的。 您可以使用引用讓被調用者修改調用者的本地變量,如下所示(add & ):

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

聲明參數dataresponses按值傳遞,這意味着對read_data()內部的自身(不是指針對象)的任何修改都不會影響main()的變量,它們的值仍然是初始化值0

您可以更改參數類型以通過引用傳遞(或通過指針傳遞,相關代碼需要調整它)。

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

參數通過復制傳遞,因此CvMat* data的指針CvMat* data是從main傳入的指針的副本 您對其所做的任何更改都是函數的本地更改。 當您使用cvCreateMat()為其賦值時,該值不會反映回main()CvMat* data ,因此當函數返回時它會丟失。

如果要將參數的更改“傳回”,則需要通過引用傳遞指針:

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

現在,對函數內部參數所做的更改發生在從函數外部傳入的變量中 - 指針不會被復制,它們會被引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM