簡體   English   中英

程序警告中的 gettinan 錯誤:隱式聲明 function 'Binsearch' [-Wimplicit-function-declaration] res= Binsearch(arr,n-1,0,x);

[英]gettinan error in the program warning: implicit declaration of function 'Binsearch' [-Wimplicit-function-declaration] res= Binsearch(arr,n-1,0,x);

#include <stdio.h>

//int Binsearch(int,int,int,int);

int main() {
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int res;
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 7;

    res = Binsearch(arr,n-1,0,x);
   
    (res == -1) ? printf("element not found") : printf("element found at index :%d", res);

    return 0;
}

int Binsearch(int arr[], int h, int l, int p) {
    int mid;
    if (h >= l) {
         mid = ((h - l) + l) / 2;
    
         if (arr[mid] == p)
           return mid;
    
         if (p > arr[mid])
           return Binsearch(arr, h, mid + 1, p);
       
         return Binsearch(arr, mid - 1, l, p);
    } 
    return -1;    
}

//得到錯誤plzz這段代碼

warning: implicit declaration of function 'Binsearch' [-Wimplicit-function-declaration]    res= Binsearch(arr,n-1,0,x);

在 C 和 C++ 中,您必須在調用它們之前聲明或定義函數。 由於main中對Binsearch的調用先於其定義,因此您首先需要在 scope 中聲明Binsearch

看起來您試圖提供一條線路

//int Binsearch(int,int,int,int);

但是您將其注釋掉,可能是因為它導致了其他錯誤。 這幾乎是正確的,但第一個參數不是int而是一個int數組。 所以應該改成

int Binsearch(int[],int,int,int);

當你省略一個聲明時,一些編譯器會提供一個“隱式”聲明,基本上是 function 的參數和返回類型的默認假設。 這個默認值幾乎總是錯誤的,所以關於隱式聲明的警告通常意味着你的代碼會失敗,除非你修復它。 有關詳細信息,請參閱警告:function 的隱式聲明


您的程序還有另一個錯誤:

     mid=((h-l)+l)/2;

也就是mid=h/2; 這不是你想要的。 特別是在某些時候,您使用h=8l=5調用Binsearch() ,這使得mid=4 由於p > arr[mid]你調用Binsearch(arr,h,mid+1, p); , 和mid+1 == 5再次,所以你的程序沒有進展,執行無限遞歸,然后崩潰。

重新思考數學並決定那條線應該是什么。

有關調試此類小程序的一般建議,請參閱https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ 特別是,使用調試器讓我很容易看到程序失敗的地方,以及hl的哪些值導致了它。 我建議自己練習使用調試器。

暫無
暫無

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

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