Я довольно новичок в 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;
}
}
некоторые плюсы или минусы?
увидеть принятый ответ
Замените свой текущий код …
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
?
РЕДАКТИРОВАТЬ: ОП объясняет, что массив 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;
}
}
Это утечка памяти, а также излишне неэффективен.
РЕДАКТИРОВАТЬ 2: причина того, что вышеприведенный код утечки памяти в том, что есть new
(который выделяет память), но не соответствует delete
выражение (которое освобождает память), и нет никаких признаков будь то память была выделена new
или предоставленный абонентом.
Причина, по которой он неэффективен, состоит в том, что динамическое выделение памяти обычно на несколько порядков медленнее, чем, например, базовое назначение или выделение стека, потому что он должен выполнить поиск подходящего небольшого свободного фрагмента памяти.
Выделение стека (C ++ «автоматическая память») позволяет избежать этой неэффективности, всегда освобождая место в обратном порядке выделения, так что он всегда может использовать начало свободной области памяти стека для следующего выделения (по модулю: на практике стек растет вниз в памяти на всех машинах, о которых я знал).
Когда вы передаете массив, вы передаете указатель на первый элемент, а не на весь массив.
Чтобы дать вам ответ, не могли бы вы отредактировать свое сообщение и добавить код при вызове функции?