指针无法获取数据

时间:2016-08-18 03:03:29

标签: c++ opencv pointers

我想获取数据的行数,但指针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什么都没有?

3 个答案:

答案 0 :(得分:1)

因为参数是按值传递的。你可以使用reference来让被调用者像这样修改调用者的局部变量(添加&):

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

答案 1 :(得分:1)

参数dataresponses被声明为按值传递,这意味着对read_data()内的自身(不是指针对象)的任何修改都不会影响{{1}中的变量},它们的值仍然是初始化值main()

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

0

答案 2 :(得分:1)

参数由 copy 传递,因此函数中的指针CvMat* data是从main传入的指针的 copy 。您对其所做的任何更改都是函数的本地更改。当您使用cvCreateMat()为其分配值时,该值不会反映回CvMat* data中的main(),以便在函数返回时丢失。

如果您希望更改参数&#34;传回&#34;你需要通过 reference 传递指针:

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

现在对函数内部参数的更改发生在从函数外部传入的变量中 - 指针未被复制,它们被引用。