0

私は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

編集(ただし、メモリリークあり):

わかりました、この答えに私はこのように解決しました:

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

受け入れられた答えを見る

4

2 に答える 2

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ですか?


EDIT : OPは、配列がfloatOpenCVに必要であることを説明しています。

彼はさらに、次のように問題を解決したことを回答で説明しています。

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++ の「自動メモリ」) は、常に割り当てとは逆の順序で割り当てを解除することにより、その非効率性を回避します。これにより、次の割り当てのために空きスタック メモリ領域の開始を常に使用できます (モジュロ方向: 実際には、スタックは下方向に成長します)。私が知っているすべてのマシンのメモリに)。

于 2013-01-09T11:05:59.853 に答える
1

配列を渡すときは、すべての配列ではなく、最初の要素へのポインターを渡します。回答をお願いします。投稿を編集して、関数を呼び出すときにコードを追加していただけますか?

于 2013-01-09T11:05:16.453 に答える