gpt4 book ai didi

c++ float 组作为默认参数

转载 作者:太空宇宙 更新时间:2023-11-04 15:47:28 25 4
gpt4 key购买 nike

我是 c++ 的新手,我无法做到这一点。抱歉,我一直使用的语言并没有帮助我从内存指针的角度思考,所以也许这是一个愚蠢的问题。

我想传递一个 float 组作为默认参数。像这样:

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

查看接受的答案

最佳答案

替换您当前的代码......

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

他在回答中进一步解释说他已按如下方式解决问题:

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++“自动内存”)通过始终以分配的相反顺序解除分配来避免效率低下,因此它始终可以使用空闲堆栈内存区域的开始进行下一次分配(模方向:在实践中在我所知道的所有机器上,堆栈在内存中向下增长。

关于c++ float 组作为默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14233733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com