【问题标题】:c++ float array as default parameterc ++浮点数组作为默认参数
【发布时间】:2012-12-23 09:54:06
【问题描述】:

我对 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

编辑(但有内存泄漏):

好的,谢谢this answer 我已经这样解决了:

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

查看接受的答案

【问题讨论】:

  • 为什么使用float而不是默认的double
  • 试试这个void getHistogram(const Mat&amp; src, MatND&amp; hist, float *range=NULL)
  • this answer中的解释
  • @flamingo:float* xfloat x[] 作为形式参数没有区别。在将其作为建议发布之前,您为什么不自己尝试一下。
  • @flamingo:即使初始化也没有区别。

标签: c++ arrays pointers default-parameters


【解决方案1】:

替换您当前的代码……

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解释说OpenCV需要float的数组。

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

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

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

EDIT 2:上述代码泄漏内存的原因是因为有一个new(分配内存),但没有对应的delete表达式(释放内存),并且没有迹象表明内存是由new 分配的还是由调用者提供的。

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

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

【讨论】:

  • 我使用浮点数是因为 OpenCV 2.4 中的函数 calHist 接受浮点值作为范围
  • 好的,我还没有看到答案编辑,抱歉。你能解释一下为什么会出现内存泄漏吗?
【解决方案2】:

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

【讨论】:

  • 好的,现在它工作了吗?顺便说一句,你需要一个浮点数组,或者你可以选择你想要的所有东西来实现?
  • 我建议使用 Cheers and hth 的解决方案。 - Alf,并划分案例(Null 与否),该解决方案避免内存泄漏并且易于阅读。
  • 在使用关键字“new”时需要小心。对于每一个新的,都必须存在一个删除。当然你可以使用你的实现,但记得也要让你的析构函数。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多