0

戻り値 CountBitDifference を currentDistance に割り当てたいと思いました。代わりに、条件ステートメントが false または true であるかどうかに応じて、0 または 1 を返します。条件ステートメントで currentDistance 値を割り当てる方法はありますか、それとも別の場所で行う必要があります。

if (int currentDistance = CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                    m1.ptr<unsigned char>(matches[i].trainIdx),
                                    cascadeSize, cascadeByteIndex) >= 8) 
4

4 に答える 4

0

コードcurrentDistanceはの結果に初期化され>=ます。currentDistanceから返された値を割り当てCountBitDifference、その値を8比較する場合(すべて同じ式で)、括弧が必要になります。

int currentDistance;
if ( ( currentDistance = CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                    m1.ptr<unsigned char>(matches[i].trainIdx),
                                    cascadeSize, cascadeByteIndex)) >= 8) 

または、より明確に:

int currentDistance = CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                    m1.ptr<unsigned char>(matches[i].trainIdx),
                                    cascadeSize, cascadeByteIndex);
if(currentDistance >= 8)
于 2013-02-19T03:40:56.837 に答える
0

まず、ログにダンプして、CountBitDifference式が想定どおりに動作していることを確認します。もしそうなら、それはおそらく奇妙なスコーピングエラーのようです。ステートメントでそれを割り当てる前に、currentDistanceを定義して初期化することはあなたを殺しますか?

また、ifステートメントはこの関数が成功したかどうかをチェックします...なぜこれを行うのですか?

編集:式の最後の比較を完全に見逃しました。これは少し厄介です。ブール値を返す関数に分割することを真剣に検討します。また、8はマジックナンバーです。

編集:これを試して、整数を返し、再利用を促す関数として。

public int getBitDifference() {

    //assumes you have declared your variables in a greater scope
    //otherwise you will have to pass your variables to the function... hard to say
    //without seeing all the code

    return CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                m1.ptr<unsigned char>(matches[i].trainIdx),
                                cascadeSize, cascadeByteIndex)


}

その後:

if (getBitDifference() >= 8) {

//do stuff here

}

はるかに読みやすい。また、マジックナンバーの使用を避けるために、定数BIT_DISTANCE_MARGINとして8を宣言します。

if (getBitDifference() >= BIT_DISTANCE_MARGIN) {

//do stuff here

}

そして、あなたはあなた自身にいくつかの読みやすく、保守可能なコードを持っています。

于 2013-02-19T03:41:25.090 に答える
0
if (int currentDistance = CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                    m1.ptr<unsigned char>(matches[i].trainIdx),
                                    cascadeSize, cascadeByteIndex) >= 8) 

読むのが難しすぎる。次のコードを試してください。

 int currentDistance = CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx) 
                                           ,m1.ptr<unsigned char>(matches[i].trainIdx)
                                           ,cascadeSize, cascadeByteIndex);
   if(currentDistance >= 8) { }

また、誰かがあなたのコードを読んでいるときに、後であなたである可能性があることを覚えておいて=ください>=。したがって、2 つのステートメントを複数の行に分割することをお勧めします。読みやすさは重要であり、不必要な簡潔さは愚かです。

于 2013-02-19T03:44:01.233 に答える
0

あなたがこれをしたい理由は何もないはずです...

if ステートメントの前に初期化するのと同じくらい簡単で、読みやすくなっています。CountBitDifference の値を保持する必要がない場合、これを行うことができないのはなぜですか。

if (CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                m1.ptr<unsigned char>(matches[i].trainIdx),
                                cascadeSize, cascadeByteIndex) >= 8)

そして、それを保持する必要がある場合は、次のようにします。

int currentDistance = CountBitDifference(m0.ptr<unsigned char>(matches[i].queryIdx),
                                m1.ptr<unsigned char>(matches[i].trainIdx),
                                cascadeSize, cascadeByteIndex);

if (currentDistance >= 8)
于 2013-02-19T03:44:26.887 に答える