c ++ массив float как параметр по умолчанию

Я довольно новичок в 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

увидеть принятый ответ

0

Решение

Замените свой текущий код …

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 ++ «автоматическая память») позволяет избежать этой неэффективности, всегда освобождая место в обратном порядке выделения, так что он всегда может использовать начало свободной области памяти стека для следующего выделения (по модулю: на практике стек растет вниз в памяти на всех машинах, о которых я знал).

5

Другие решения

Когда вы передаете массив, вы передаете указатель на первый элемент, а не на весь массив.
Чтобы дать вам ответ, не могли бы вы отредактировать свое сообщение и добавить код при вызове функции?

1

По вопросам рекламы [email protected]