1

だから..アサートで関数をテストしています:(pBola1の値は1です)

assert(BomboTest.TreureBola(1)==pBola1);

BomboTest.TreureBola リストの乱数 (この場合は 1 を返す必要があります) を返す関数です。

cBola* cBombo::TreureBola(int num)
{
    int posicio_aleatoria;

    posicio_aleatoria= rand() % (num);

    return(Boles.TreureElement(posicio_aleatoria)); 
}

そしてTreureElementは、抽出したい要素の位置を知っている動的リストの要素を返す関数です(この場合、1である「retorn」を返します)

cBola* cLlista::TreureElement(int posicio)
{
    int i;
    cBola* recorreLlista;
    cBola *retorn;
    recorreLlista=primer;
    retorn = primer;
    i=0;

    if (posicio == 0)
    {
        primer = (*primer).getSeguent();
    }
    else
    {
        // Busquem la posició //
        while(i < posicio)
        {
            recorreLlista= retorn;
            retorn = (*retorn).getSeguent();
            i++;
        }
        (*recorreLlista).setSeguent( (*retorn).getSeguent() );
    }
    numElements--;
    return retorn;
}

理由はわかりませんが、アサートは失敗します。'retorn' というポインタがあるので、TreureElement が返す値はわかりますが、TreureBola が返す値はわかりません.TreureBola が返す値をデバッガで確認する方法はありますか?

PD:Visual Studio 2010 を使用しています。

4

3 に答える 3

6

ローカルを作成するだけ

cBola* pTemp = BomboTest.TreureBola(1);
assert(pTemp==pBola1);

逆アセンブルを調べてリターン レジストリを調べることもできますが、これはやり過ぎのようです。上記は正しいアプローチであり、他の人が将来同じ問題に遭遇したときに感謝します.

于 2013-05-20T22:57:03.180 に答える
5

いつでも一時的に変更できます

assert(BomboTest.TreureBola(1)==pBola1);

へ`

auto tmp=BomboTest.TreureBola(1);
assert(tmp==pBola1);

最初の行にブレークポイントを配置します。

于 2013-05-20T22:58:16.113 に答える
1

代わりに使用する assert の周りに小さなラッパーを書きます。

template <typename T>
void compare(const T& lhs, const T& rhs)
{
  if (lhs != rhs)
    cout << "The values were not the same! " << lhs << " vs. " << rhs << endl;
  assert(lhs == rhs);
}

これでも が呼び出さassertれますが、最初に (うまくいけば) 役に立つ出力が得られます。

したがって、呼び出す代わりに:

assert(BomboTest.TreureBola(1)==pBola1);

次のように呼び出します。

compare(BomboTest.TreureBola(1), pBola1);

これには、ここにブレークポイントを配置して、TreureBola がデバッガーで何を返したかを確認できるという追加の利点もあります。

于 2013-05-20T23:03:29.307 に答える