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 它是一个函数,它返回动态列表的元素,知道您要提取的元素的位置(在这种情况下返回 'retorn' 是 1)

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;
}

我不知道为什么,但断言失败了。我可以看到 TreureElement 返回的值,因为我有指针'retorn',但我不知道 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 回答