0

我对 c++ 很陌生,但我无法使它正常工作。抱歉,但我一直使用的语言不能帮助我从内存指针的角度思考,所以也许这是一个愚蠢的问题。

我想将浮点数组作为默认参数传递。像这样:

void getHistogram(const Mat& src, MatND& hist, float range[]=NULL) {

    if(range==NULL) {
        double maxPixel=0;
        minMaxLoc(src, 0, &maxPixel, 0, 0);
        range = { 0, maxPixel +1 };
    }

    // now calculate histogram with the right range
    // something something
}

我尝试过一些不同的语法,但我总是在一些错误的前面,比如

histogram.cpp:21: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
histogram.cpp:21: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘float*’ in assignment

编辑(但有内存泄漏):

好的,这就是我以这种方式解决的这个答案:

void imHist(const Mat& src, MatND& hist, float range[]=NULL) {

    if(range==NULL) {
        double maxPixel=0;
        minMaxLoc(src, 0, &maxPixel, 0, 0);

        range = new float[2];
        range[0] = 0;
        range[1] = maxPixel +1;
    }

}

一些优点或缺点?

编辑 2

查看接受的答案

4

2 回答 2

5

替换您当前的代码……

void getHistogram(const Mat& src, MatND& hist, float range[]=NULL) {

    if(range==NULL) {
        double maxPixel=0;
        minMaxLoc(src, 0, &maxPixel, 0, 0);
        range = { 0, maxPixel +1 };
    }

    // now calculate histogram with the right range
    // something something
}

有了这个:

void getHistogram(const Mat& src, MatND& hist, float range[] ) {
    assert( range != 0 );
    // now calculate histogram with the right range
    // something something
}

void getHistogram(const Mat& src, MatND& hist ) {
    double maxPixel=0;
    minMaxLoc(src, 0, &maxPixel, 0, 0);
    float range[] = { 0, maxPixel +1 };
    getHistogram( src, hist, range );
}

也就是说,你为什么使用float而不是double


编辑:OP解释说floatOpenCV需要数组。

他在回答中进一步解释说,他已通过以下方式解决了该问题:

void imHist(const Mat& src, MatND& hist, float range[]=NULL) {

    if(range==NULL) {
        double maxPixel=0;
        minMaxLoc(src, 0, &maxPixel, 0, 0);

        range = new float[2];
        range[0] = 0;
        range[1] = maxPixel +1;
    }
}

这会泄漏内存,并且不必要地低效。

编辑2:上述代码泄漏内存的原因是因为有一个new(分配内存),但没有相应delete的表达式(释放内存),并且没有指示内存是由调用者分配还是new由调用者提供.

它效率低下的原因是动态内存分配通常比基本分配或堆栈分配慢几个数量级,因为它必须搜索合适的小块空闲内存。

堆栈分配(C++“自动内存”)通过总是以相反的分配顺序来避免这种低效率,因此它总是可以使用空闲堆栈内存区域的开始进行下一次分配(模方向:实际上堆栈向下增长在我所知道的所有机器上的内存中)。

于 2013-01-09T11:05:59.853 回答
1

当你传递一个数组时,你传递一个指向第一个元素的指针,而不是整个数组。为了给你一个回应,你可以在调用函数时编辑你的帖子并添加代码吗?

于 2013-01-09T11:05:16.453 回答