[英]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=8
和l=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/ 。 特別是,使用調試器讓我很容易看到程序失敗的地方,以及h
和l
的哪些值導致了它。 我建議自己練習使用調試器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.