【问题标题】:Infinite loop, cannot get values无限循环,无法获取值
【发布时间】:2015-10-02 08:06:07
【问题描述】:

我花了 3 个小时试图让这段代码正常工作,但是每当我尝试时,我都会陷入循环并且控制台会不断循环。我已经尝试了所有方法 - 我创建了一个只返回 i 并重新分配值的函数,但它似乎不起作用。

出于某种原因,每当我尝试使用逻辑运算符时,它都不想对我起作用。 mes->hand[x] 的值类似于 "2D,4D,3C,5C,6H,7H" 等等,而花色是 "H", "C" , "D", "S"参考卡片。

int newtrick_value(struct Message *mes, int suit) {
    int len = strlen(mes->hand);
    int x = 0, i = 50, y = 0;
    while (i < 63) {
        while(x < len) {
            if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
                if(i>= 58){
                    return y;
                }   
                return i;
            }
            x++;
            continue;
        }
        if(i >= 57) {
            y = determine_letter(i);        
        }
        i ++;
        x = 0;
        continue;
    }
    return 0;
}

【问题讨论】:

  • 在调试器中运行,逐行执行代码。这应该可以帮助您找到此类问题。
  • 这是怎么调用的,什么是struct Message?什么是确定字母?因为据我所知,除了那个调用之外, newtrick_value 将在最多 len * 13 次迭代后终止
  • 推荐什么调试器?
  • 这里适合使用MCVE
  • @ShouBarrett 我们推荐您的开发环境附带的调试器。我们不知道你有哪个开发环境/平台;如果您告诉我们这可能会有所帮助。

标签: c loops infinite-loop


【解决方案1】:

我有以下观察:

  1. 您的continue 语句是多余的。您已经处于循环的底部。 (不过没有坏处。)

  2. 您的号码50 等都是指ASCII 字符。添加有关此的 cmets。

  3. 我能找到的唯一错误是:

    if(i >= 57) {
        y = determine_letter(i);        
    }
    

这应该是if (i&gt;=58),因为 57 ASCII 是 9。可能determine_letter 在收到 57 时会感到困惑(该函数显然将高于 9 的卡映射到您的卡编码方案中,而您没有完全提供该方案)。因此,该函数可能会在 return y; 中返回一个无效值,调用函数不理解该值并导致您的控制台循环。

此语句也应放在while (x &lt; len) 之前,因此您首先映射字符然后比较它,并在循环结束时递增i 以供下一个字符(卡片值)进行比较。

应用这些观察结果:

int newtrick_value(struct Message *mes, int suit) {
    int len = strlen(mes->hand);
    int x = 0, i = 50, y = 0;
    while (i < 63) {
        if (i >= 58) {
            y = determine_letter(i);        
        }
        while (x < len) {
            if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
                if (i >= 58) {
                    return y;
                }   
                return i;
            }
            x++;
        }
        i++;
        x = 0;
    }
    return 0;
}

如果没有调用者、子功能和卡片编码方案的所有详细信息,我无法提供更多建议。我希望这会有所帮助。

注意:考虑功能,该函数只返回给定花色的第一张牌的值。这意味着比较卡片价值的外部循环似乎毫无用处:首先找到第一个花色,然后获取它的价值更有效:

int newtrick_value(struct Message *mes, int suit) {
    int len = strlen(mes->hand);
    int x = 0;

    while (x < len) {
        if (mes->hand[x] == suit)){
            return(mes->hand[x-1]);
        }
        x++;
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    作为 MWE,这会将“calling determine letter”打印到控制台 6 次:

    #include <stdio.h>
    #include <string.h>
    
    int newtrick_value(char* hand, int suit) {
        int len = strlen(hand);
        int x = 0, i = 50, y = 0;
    
        while (i < 63) 
        {
            x = 0;
            while(x < len) 
            {
                printf("i%d, y%d, suit %d, hand[x] %d, hand[x+1] %d\n", i, y, suit, hand[x], hand[x+1]);
                if (((hand[x] == i || hand[x] == y) && hand[x+1] == suit))
                {
                    if(i>= 58)
                    {
                        return y;
                    }   
                    return i;
                }
                x++;
            }
            if(i >= 57) 
            {
                printf("Calling determine letter\n");
                //y = determine_letter(i);        
            }
    
            i++;
        }
        return 0;
    }
    
    int main(void) 
    {
        newtrick_value("2H,3H", (int)"H");
        return 0;
    }
    

    据我所知,我没有更改任何逻辑(只是一些格式)。它不应该给出这种行为,因为花色和价值应该匹配。

    奇怪的是,打印结果如下:

    i50, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i50, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i50, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i50, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i50, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i51, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i51, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i51, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i51, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i51, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i52, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i52, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i52, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i52, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i52, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i53, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i53, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i53, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i53, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i53, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i54, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i54, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i54, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i54, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i54, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i55, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i55, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i55, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i55, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i55, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i56, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i56, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i56, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i56, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i56, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    i57, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i57, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i57, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i57, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i57, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    Calling determine letter
    i58, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i58, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i58, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i58, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i58, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    Calling determine letter
    i59, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i59, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i59, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i59, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i59, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    Calling determine letter
    i60, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i60, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i60, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i60, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i60, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    Calling determine letter
    i61, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i61, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i61, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i61, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i61, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    Calling determine letter
    i62, y0, suit 134514349, hand[x] 50, hand[x+1] 72
    i62, y0, suit 134514349, hand[x] 72, hand[x+1] 44
    i62, y0, suit 134514349, hand[x] 44, hand[x+1] 51
    i62, y0, suit 134514349, hand[x] 51, hand[x+1] 72
    i62, y0, suit 134514349, hand[x] 72, hand[x+1] 0
    Calling determine letter
    

    因此,将“H”转换为整数给出的花色值似乎特别古怪。

    我已经假设您在结构中如何表示 mes-&gt;hand,但希望这仍然成立。不过我注意到的一件事是,你为什么要以int 而不是char 的身份传递西装?这似乎是一件更合乎逻辑的事情。

    因此,如果您进入无限循环,我怀疑mes-&gt;hand 可能不是以空值结尾的,这意味着strlen(mes-&gt;hand) 将返回一些未知值,这意味着while(x &lt; len) 可能看起来就像它永远不会终止一样。您能否检查 mes-&gt;hand 以确保它是有效(和预期的)字符串?

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 1970-01-01
      • 2020-07-16
      • 2016-11-09
      • 2019-12-17
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多