我似乎无法找到此功能的问题。我对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++;
}
}
}
答案 0 :(得分:2)
如果coin
既不是0
也不是1
,编译器会看到函数结束而不返回任何内容。
如果您确定在coin
不是0
或1
的情况下不会调用此函数,那么您可以用简单的方式替换if (coin == 1) {...} else if (coin == 0) {...}
if (coin == 1) {...} else {...}
。
编辑:
还有一个问题是编译器发现如果j
在0
个循环中出现1
或while
之外的其他内容,那么函数会离开循环并返回而不返回任何内容。
您至少有两个选项可以解决这个问题:
if (j == 1)
更改为if (j != 0)
。或
return -1;
。答案 1 :(得分:2)
如果while
,编译器会看到离开j!=0
循环。如果为j=check_win_loss(...)
分配了除1
以外的任何值,则该方法没有返回值。
典型的C解决方案:在方法结束时返回错误代码,例如return -1
。
答案 2 :(得分:0)
您coin
和check_win_loss
只能/返回0
或1
,但编译器不知道。如果coin == 2
或check_win_loss
return
编辑3
,您将退出该功能,而无需执行return
。
解决方案:尝试制作他们的(返回)类型bool并查看它是否修复了它。否则,请考虑在函数末尾返回错误值或执行assert(0 && "This shouldn't ever happen");
以安抚编译器。
请记住,这只是一个警告,而不是错误(但如果它们实际返回的内容与0
或1
不同,并且您退出时没有返回值,但无论如何都要读取它,行为未定义,这更糟糕。)