Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 控制可能达到非无效函数错误的末尾_C_Xcode - Fatal编程技术网

C 控制可能达到非无效函数错误的末尾

C 控制可能达到非无效函数错误的末尾,c,xcode,C,Xcode,我似乎找不到这个函数的问题。我是C语言的新手,我试图理解为什么这个函数不会。。。作用我使用Xcode并以“控件可能到达非无效函数的末尾”警告结束。谢谢你的帮助 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

我似乎找不到这个函数的问题。我是C语言的新手,我试图理解为什么这个函数不会。。。作用我使用Xcode并以“控件可能到达非无效函数的末尾”警告结束。谢谢你的帮助

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

对你来说,
coin
check\u win\u loss
只能是/返回
0
1
,但编译器不知道这一点。如果
coin==2
检查赢与输
返回
ed
3
,您将退出该功能,而不执行
返回

解决方案:尝试使他们的(返回)类型bool,看看它是否修复了它。否则,考虑在函数的末尾返回一个错误值,或者做一个<代码>断言(0 & &“这是不应该发生的”);代码>以安抚编译器


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

如果您确信
coin
不是
0
1
调用此函数,那么您可以将
If(coin==1){…}或者If(coin==0){…}
替换为一个简单的
If(coin==1){…}或者{…}


编辑:

还有一个问题是,编译器会发现,如果
j
while
循环中的任何一个循环中变成了
0
1
,那么函数将离开该循环并返回,而不返回任何内容

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

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

  • 添加
    return-1在函数末尾

如果
j!编译器看到退出
循环=0
。如果为eg
j=check\u win\u loss(…)
分配了除
1
以外的任何值,则该方法没有返回值


典型的C解决方案:在方法末尾返回一个错误代码,例如return-1

可能编译器被你那里的死代码(返回后中断)弄糊涂了?无论如何,这个警告来自于对所有可能的代码路径的分析,如果您创建了一个,我很肯定您会在某个时候找到为什么函数有时不返回的答案。