2017-07-20 1 views
-1

特定の条件のバイナリ検索プログラムを作成するように求められました。私は下限、上限、配列へのポインタ、および検索要素を渡さなければなりません。私が書いたプログラムは私に警告を与えた。私はプログラムのエラーを修正することができません。私が間違っているところを教えてください。Cでポインタを使用したバイナリ検索

#include <stdio.h> 
int BinarySearch(int , int , int *, int); 

int main() 
{ 
    int n, i, a[20], h, l, x, r=0; 
    int *p; 

    printf("Enter the number of elements:\n"); 
    scanf("%d",&n); 

    printf("Enter the elements:\n"); 
    for(i=0 ; i<n ; i++) 
    { 
     scanf("%d",&a[i]); 
    } 

    p = &a[0]; 
    printf("Enter the element to be searched:\n"); 
    scanf("%d", &x); 

    l = 0; 
    h = n-1; 

    r = BinarySearch(l, h, p, x); 

    if(r == 1) 
    printf("The element %d is found in position %d", x, i); 
    else 
    printf("The element %d is not present in the array", x); 

    return 0; 
} 

int BinarySearch(int l, int h, int *p, int x) 
{ 
    int mid, a[20], f =0; 
    *p = a[0]; 
    mid = (l + h)/2; 

    while(l <= h) 
    { 
     if(a[mid] == x) 
     { 
      f=1; 
      break; 
     } 
     else if(a[mid] > x) 
     { 
      h = mid-1; 
     } 
     else if(a[mid] < x) 
     { 
      l = mid+1; 
     } 
    } 
    if(f == 1) 
    {return 1;} 
    else 
    {return -1;} 
} 

これをコンパイルすると、この警告が表示されます。私はプログラムを実行すると、プログラムは検索要素の値を取り、いくつかの時間後に終了

main.c|43|warning: 'a[mid]' may be used uninitialized in this function [-Wmaybe-uninitialized]| 
main.c|48|warning: 'a[mid]' may be used uninitialized in this function [-Wmaybe-uninitialized]| 
main.c|52|warning: 'a[mid]' may be used uninitialized in this function [-Wmaybe-uninitialized]| 

:私はライン*p = a[0];を削除すると

main.c|38|warning: 'a[0]' is used uninitialized in this function [-Wuninitialized]| 

は、その後、私は、次のエラーメッセージを取得します。バイナリ検索機能には制御が移りません。

+4

なぜあなたは 'a'配列を導入しましたか?あなたは 'p'で検索するはずです(それを変更しないでください)。また、 '1'や' -1'ではなく、その位置を返すことになっています。 – molbdnilo

+2

テスト目的でイニシャライザリストを使用します。毎回手動でデータを入力すると、ミスをしたり、ソートされていないデータを入力したり、デバッグを難しくするたびに異なるデータを入力したりするのは簡単です。また、ほとんどの時間を使って情報を入力すると、デバッグが面倒になります。 –

+2

' 'の' bsearch() 'を使うのではなく、自分の' BinarySearch() 'を実装するのには良い理由はありますか? –

答えて

2

のは、あなたのint BinarySearch(int l, int h, int *p, int x)がどのように動作するかを考えてみましょう:

  1. l,hは(データはa[20]メインで宣言されています。int n, i, a[20], h, l, x, r=0;
  2. pはデータへのポインタである境界です
  3. xがチェックする値であり、に対して

pがpoinの場合あなたのデータには、pがすでに正しいアドレスを指しているので、関数内に新しいa[20]を宣言したり、*p = a[0];に宣言したりする必要はありません(実際には間違っています)。それらは、元のアレイはメイン内で定義されているif(p[mid] == x)代わりif(a[mid] == x)

2

の使用()と別個アレイはBinarySearchに定義されています()。ポインタpは、mainに定義された配列をポイントするために割り当てられます。

p = &a[0]; 

ポインタPが(BinarySearchに渡され)、次いで割り当て

*p = a[0] 

はInfactは新しいアレイBinarySearch(で定義された)の最初の要素へのポインタの内容を変更しています。新しい配列は初期化されていないため、適切なコンパイラの警告が返されます。

0

どちらも以前の答えは有効なようですが、問題への迅速な修正は修正することです:

int mid, f =0; 

int mid, a[20], f =0; 
*p = a[0]; 

を次にpは関数内BinarySearchへのすべての参照を更新します。

pで指される配列からデータを読み込むだけで、配列全体を割り当てる必要はありません。

関連する問題