控制可能达到非空函数ERROR的结束

时间:2018-03-24 19:51:36

标签: c xcode

我似乎无法找到此功能的问题。我对C比较陌生,并试图理解为什么这个功能赢得了...功能。我使用Xcode并以#34结束;控件可能会达到非空函数的结束"警告。谢谢你的帮助

int call_shooting(char p1[10][10], char p2[10][10], char p3[10][10], char p4[10][10], char hit_miss[2], char data[5][2], int coin, int hit_miss_storage[2][128], int coord_storage[4][128])
{
    int j = 0, k = 0, f = 0;

    if (coin == 1)
    {
        while (j == 0)
        {
            shoot(p1, p2, p3, p4, 1, hit_miss, k, hit_miss_storage, coord_storage);
            check_sink(p1, data, 0);

            j = check_win_loss(p1);
            if (j == 1)
            {
                system("cls");
                print_board(p2, p4);
                hit_miss_ships(hit_miss);
                sunken_ships(data);
                printf("\nYou won!!!\n\n");
                return 1;
                break;
            }
            shoot(p1, p2, p3, p4, 0, hit_miss, k, hit_miss_storage, coord_storage);
            check_sink(p2, data, 1);

            j = check_win_loss(p2);
            if (j == 1)
            {
                system("cls");
                print_board(p2, p4);
                hit_miss_ships(hit_miss);
                sunken_ships(data);
                printf("\nYou lost!!!\n\n");
                return 0;
                break;
            }
            system("cls");

            print_board(p2, p4);
            hit_miss_ships(hit_miss);
            sunken_ships(data);

            k++;
            f++;
        }
    }
    else if (coin == 0)
    {
        while (j == 0)
        {
            shoot(p1, p2, p3, p4, 0, hit_miss, k, hit_miss_storage, coord_storage);
            check_sink(p2, data, 1);


            j = check_win_loss(p2);
            if (j == 1)
            {
                system("cls");
                print_board(p2, p4);
                hit_miss_ships(hit_miss);
                sunken_ships(data);
                printf("\nYou lost!!!\n\n");
                return 0;
                break;
            }
            system("cls");
            print_board(p2, p4);
            hit_miss_ships(hit_miss);
            sunken_ships(data);

            shoot(p1, p2, p3, p4, 1, hit_miss, k, hit_miss_storage, coord_storage);
            check_sink(p1, data, 0);


            j = check_win_loss(p1);
            if (j == 1)
            {
                system("cls");
                print_board(p2, p4);
                hit_miss_ships(hit_miss);
                sunken_ships(data);
                printf("\nYou won!!!\n\n");
                return 1;
                break;
            }
            system("cls");

            print_board(p2, p4);
            hit_miss_ships(hit_miss);
            sunken_ships(data);

            k++;
            f++;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

如果coin既不是0也不是1,编译器会看到函数结束而不返回任何内容。

如果您确定在coin不是01的情况下不会调用此函数,那么您可以用简单的方式替换if (coin == 1) {...} else if (coin == 0) {...} if (coin == 1) {...} else {...}

编辑:

还有一个问题是编译器发现如果j0个循环中出现1while之外的其他内容,那么函数会离开循环并返回而不返回任何内容。

您至少有两个选项可以解决这个问题:

  • 将所有if (j == 1)更改为if (j != 0)

  • 在功能结束时添加return -1;

答案 1 :(得分:2)

如果while,编译器会看到离开j!=0循环。如果为j=check_win_loss(...)分配了除1以外的任何值,则该方法没有返回值。

典型的C解决方案:在方法结束时返回错误代码,例如return -1

答案 2 :(得分:0)

coincheck_win_loss只能/返回01,但编译器不知道。如果coin == 2check_win_loss return编辑3,您将退出该功能,而无需执行return

解决方案:尝试制作他们的(返回)类型bool并查看它是否修复了它。否则,请考虑在函数末尾返回错误值或执行assert(0 && "This shouldn't ever happen");以安抚编译器。

请记住,这只是一个警告,而不是错误(但如果它们实际返回的内容与01不同,并且您退出时没有返回值,但无论如何都要读取它,行为未定义,这更糟糕。)