0

我想将返回值 CountBitDifference 分配给 currentDistance。相反,它返回给我一个 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

}

更具可读性。还要将 8 声明为常量 BIT_DISTANCE_MARGIN 以避免使用幻数,所以

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) { }

还要记住,当有人正在阅读您的代码时,可能是您在以后的日期,他们/您可能不记得和运算符的关联性=以及>=一个相对于另一个的优先级。因此,将两个语句分成多行是一个好主意。可读性很重要,不必要的简洁是愚蠢的。

于 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 回答