【问题标题】:This loop is infinite but it should not be - C [closed]这个循环是无限的,但它不应该是-C [关闭]
【发布时间】:2017-01-05 08:47:58
【问题描述】:

看看这个:

 int find_grad(int * table, int * value)
    {
      int i = 0;

      while (find_max_value(table) >= value)
      {
        table[(find_max_position(table))] = 0;
        i++;
      }

    return i;
    }

这是一个非常简单的函数:它使用另一个名为“find_max_position”的函数(确实有效,我测试过),它遍历整数向量以查找最大值的位置。所以如果向量是 {1, 3, 19},find_max_position 返回一个整数,在本例中为 1。

我需要 find_grad 来查找我输入的值的“等级”。例如,如果我在像 {0, 1, 5, 4, 3} 这样的向量上调用 find_grad(table, 3),该函数应该返回 2,因为 3 是第三个更大的值(它从 0 开始)。 但是当我调用该函数时,循环变得无限。我认为这可能是因为当我执行“table[(find_max_position(table))] = 0;”时我正在对向量的副本而不是向量本身进行操作,并且当循环重新启动较大的值时,它总是在那里。也许我解释的情况有点糟糕,但我认为阅读代码很容易理解。有人可以帮忙吗?

编辑:我忘记了 > find_max_value 只返回一个整数,即在整数向量上找到的较大值。

【问题讨论】:

  • 鉴于valueint*find_max_value(table) >= value 真的是正确的比较吗?
  • 如果您为编译器启用它们(-Wall -Wextra for gccclang,例如)。
  • 在这里发布整个代码。可能是您调用的函数导致了无限循环!
  • 这是stats.c的全部代码,里面包含了我使用的所有函数ghostbin.com/paste/auxxh

标签: c loops vector infinite


【解决方案1】:

问题是您正在将整数与指针进行比较。您在value 之前错过了*

正确代码:

int find_grad(int * table, int * value)
{
    int i = 0;

    while (find_max_value(table) >= *value)
    {
        table[(find_max_position(table))] = 0;
        i++;
    }

    return i;
}

即使不使用指针也可以做到这一点。您只需要在value 之前删除*

int find_grad(int * table, int value)
{
    int i = 0;

    while (find_max_value(table) >= value)
    {
        table[(find_max_position(table))] = 0;
        i++;
    }

    return i;
}

【讨论】:

  • 谢谢,成功了。现在我得到了分段错误,但至少循环结束了
  • 请检查崩溃的地方!我没有看到任何使该函数内的程序崩溃的东西! @MatteoDelSeppia
  • @KhairulBasarRofi:调用 find_grad(table, 3); 可能是原因,该函数需要 int * 而不是 int
  • @AlterMann 可能!虽然我不确定实际上!但是使用int 而不是* int 会更容易。我不知道为什么OP在这里使用指针!
  • 谢谢你们,你们太棒了!我解决了这个问题,我删除了所有不需要的指针,现在它工作正常:)
【解决方案2】:

好像你在比较指针,或者指针和整数。可能这不是你真正想要的。

【讨论】:

  • 如果函数不影响他的值,他需要取消引用指针> = *value 或传递一个普通的int 而不是指向int 的指针。
  • 我删除了指向整数的指针,但它是一样的。
【解决方案3】:

您正在比较 int 和指针。只需将行 int find_grad(int * table, int * value) 更改为此 int find_grad(int * table, int value)。这应该可以正常工作。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多