簡體   English   中英

控制可能會到達非空函數錯誤的結尾

[英]Control may reach end of non-void function ERROR

我似乎找不到此功能的問題。 我對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既不是0也不是1則該函數將結束而不返回任何內容。

如果你肯定知道這個功能不會被稱為coin存在任何比其他01 ,那么你可以取代你if (coin == 1) {...} else if (coin == 0) {...}和簡單的if (coin == 1) {...} else {...}


編輯:

還有一個問題是編譯器會看到,如果j在您的while循環中的任何一個循環內變為01以外的0 ,則該函數將離開該循環並返回而不返回任何內容。

您至少有兩個選擇可解決此問題:

  • 將所有的if (j == 1)更改為if (j != 0)

要么

  • 添加return -1; 在您的功能結束時。

如果j!=0while編譯器會看到退出while循環。 如果為j=check_win_loss(...)分配了除1以外的任何其他值,則該方法沒有返回值。

典型的C解決方案:在方法末尾返回錯誤代碼,例如return -1

對於您而言, coincheck_win_loss只能是/返回01 ,但是編譯器不知道。 如果coin == 2check_win_loss return ed 3 ,則無需執行return就可以退出該函數。

解決方案:嘗試使它們的(返回)類型bool看看是否可以解決。 否則,請考慮在函數末尾返回錯誤值或執行assert(0 && "This shouldn't ever happen"); 調整編譯器。

請記住,這僅是警告,而不是錯誤(但是,如果它們實際上返回的值不同於01並且您退出時沒有返回值,但無論如何都將其讀取,則行為是不確定的,這會更糟)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM