我对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;
}
}
一些优点或缺点?
查看已接受的答案
答案 0 :(得分: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解释说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;
}
}
这会泄漏内存,和不必要地效率低下。
编辑2 :上述代码泄漏内存的原因是因为有一个new
(分配内存),但没有相应的delete
表达式(释放了内存),并且没有迹象表明是否内存是由new
分配的还是由呼叫者提供的。
效率低的原因是动态内存分配通常比例如动态内存分配慢几个数量级。一个基本的赋值或堆栈分配,因为它必须搜索一个合适的小空闲内存块。
堆栈分配(C ++“自动存储器”)通过总是以相反的分配顺序解除分配来避免低效率,因此它总是可以使用空闲堆栈存储区的开始进行下一次分配(模数方向:实际上在我所知道的所有机器上,堆栈在内存中向下增长。
答案 1 :(得分:1)
传递数组时,将指针传递给第一个元素,而不是所有数组。 为了给你一个回应,你可以编辑你的帖子并在你调用函数时添加代码吗?