0

std :: vectorをウォークして、2つの隣接するタプルを探す比較的単純なアルゴリズムがあります。X値の左右のタプルが見つかったら、それらの間を補間できます。どういうわけかこれは機能します:

  std::vector<LutTuple*>::iterator tuple_it;
  LutTuple* left = NULL;
  LutTuple* right = NULL;
  bool found = 0;

  // Only iterate as long as the points are not found
  for(tuple_it = lut.begin(); (tuple_it != lut.end() && !found); tuple_it++) {
    // If the tuple is less than r2 we found the first element
    if((*tuple_it)->r < r) {
        left = *tuple_it;
    }
    if ((*tuple_it)->r > r) {
        right = *tuple_it;
    }
    if(left && right) {
        found = 1;
    }
  }

この間:

  std::vector<LutTuple*>::iterator tuple_it;
  LutTuple* left = NULL;
  LutTuple* right = NULL;

  // Only iterate as long as the points are not found
  for(tuple_it = lut.begin(); tuple_it != lut.end() && !left && !right; tuple_it++) {
    // If the tuple is less than r2 we found the first element
    if((*tuple_it)->r < r) {
        left = *tuple_it;
    }
    if ((*tuple_it)->r > r) {
        right = *tuple_it;
    }
  }

ではない。何故ですか?このような2つのNULLptrは、否定されたときに一緒にtrueと評価されると思います。

4

3 に答える 3

5

2番目のループは、どちらかが見つかるとすぐに終了します。条件を次のように変更します。

tuple_it != lut.end() && !(left && right)

また

tuple_it != lut.end() && (!left || !right)

両方が見つかるまで続行します。

于 2012-04-10T15:21:40.547 に答える
4

論理的な問題があります。

最初のスニペットには(基本的に)があり!(left && right)ます。

2番目のスニペットには次のものがあります!left && !right

それらは同等ではありません。

真理値表を作成すると、それ!(left && right)がと同等であることがわかります(!left || !right)

于 2012-04-10T15:23:26.160 に答える
0

このような2つのNULLptrは、否定されたときに一緒にtrueと評価されると思います。

これは意味がありません。ポインタを「ネゲート」しないでください。ブール式に強制されたときにポインタが何を評価するかを期待してください。代わりに、それらを明示的にNULLと比較することをお勧めします。

また、ループを継続するための複雑なブール式を別の行に移動します。そうしないと、コードを論理的に追跡することが非常に困難になります。

于 2012-04-10T15:22:13.317 に答える