C 控制可能达到非无效函数错误的末尾
我似乎找不到这个函数的问题。我是C语言的新手,我试图理解为什么这个函数不会。。。作用我使用Xcode并以“控件可能到达非无效函数的末尾”警告结束。谢谢你的帮助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
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
或检查赢与输
返回
ed3
,您将退出该功能,而不执行返回
解决方案:尝试使他们的(返回)类型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
。如果为egj=check\u win\u loss(…)
分配了除1
以外的任何值,则该方法没有返回值
典型的C解决方案:在方法末尾返回一个错误代码,例如return-1
可能编译器被你那里的死代码(返回后中断)弄糊涂了?无论如何,这个警告来自于对所有可能的代码路径的分析,如果您创建了一个,我很肯定您会在某个时候找到为什么函数有时不返回的答案。