【问题标题】:C trying to fix infinite loopC试图修复无限循环
【发布时间】:2019-07-21 06:36:15
【问题描述】:

我有一个获取索引值的函数,将其放入数组中。然后使用 rand + srand(key) 生成一个新的新随机索引。它会检查新生成的索引是否已经在数组中,它将继续生成新索引并检查,直到生成唯一值。

问题在于它适用于小的,但对于较长的键,它会陷入无限循环并且永远找不到唯一值。这是我的代码:

int getNewIndex(PPM *im, int index, int *visitedPixels, int *visitedPixelsIndex) {

    int i = 0;
    if(*visitedPixelsIndex == im->height) {
        perror("Cannot encode anymore: pixels limit reached");
        exit(1);
    }

    visitedPixels[*visitedPixelsIndex] = index;
    (*visitedPixelsIndex)++;
    // If index is already in the list, generate a new number and check again.
    while (i < *visitedPixelsIndex) {
        if(index == visitedPixels[i]) {
            index = rand() % im->height;
            i = 0;
        } else {
            i++;
        }
    }

    return index;
}

编辑:im-&gt;height,即图像高度平均约为 400-600。

【问题讨论】:

  • 你提到的“键”是什么?
  • 如果从0im-&gt;height 的所有值都在您的数组中,则会出现无限循环
  • visitedPixelsIndex == im-&gt;height 这是错误的!应该是*visitedPixelsIndex == im-&gt;height
  • 建议:用简单的if重写你的条件运算符表达式。
  • 这是一个建议。在您的代码中,对我来说,if 比条件运算符更容易掌握。我喜欢使条件运算符中的表达式尽可能简单(绝对不是您的代码中的完整语句)。

标签: c algorithm random


【解决方案1】:

据我所知,当您将最后一个空闲索引插入数组时,代码将生成一个无限循环。

假设:

1) im-&gt;height 为 500,因此有效索引在 [0 .. 499] 范围内

2) 你已经插入了 499 个值,即*visitedPixelsIndex 是 499

所以当函数被调用时,这个条件*visitedPixelsIndex == im-&gt;height 将是假的,所以你不要退出而是继续,你在数组中插入数值 500。

然后你做(*visitedPixelsIndex)++;,这样*visitedPixelsIndex就变成了500。

之后,您进入while 循环,试图找到一个新的未使用的index。但是 - 由于您已经使用了所有 500 个有效索引值,因此您永远不会找到未使用的索引。

换句话说 - 无限循环

也许你应该这样做:

(*visitedPixelsIndex)++;
if(*visitedPixelsIndex == im->height) {
    perror("Cannot encode anymore: pixels limit reached");
    exit(1);
}

我也认为你应该在while循环之前之前生成一个新的index

但是,总的来说,如果您将当前函数拆分为两个函数,我认为您的代码会更清晰。喜欢

int isPresent(int index, int *visitedPixels, int N) 
{
    for(int i = 0; i<N; ++i)
    {
        if (index == visitedPixels[i]) return 1;
    }
    return 0;
}

int getNewIndex(PPM *im, int index, int *visitedPixels, int *visitedPixelsIndex) 
{
    visitedPixels[*visitedPixelsIndex] = index;

    (*visitedPixelsIndex)++;

    if (*visitedPixelsIndex == im->height) {
        perror("Cannot encode anymore: pixels limit reached");
        exit(1);
    }

    do
    {
        index = rand() % im->height;
    } while(isPresent(index, visitedPixels, *visitedPixelsIndex));

    return index;
}

【讨论】:

  • 我刚刚测试了它,你是对的,它达到了索引限制。我会尝试修复它。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多