指针无法获取数据



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

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

如果你想让参数的改变被"传回",你需要通过引用:

传递指针。
// pass variables by reference using &
int read_data(CvMat*& data, CvMat*& responses)

现在,对函数内部参数的更改发生在从函数外部传入的变量上-指针不会被复制,而是被引用。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新