2017-07-20 1 views
-1

On m'a demandé d'écrire un programme de recherche binaire avec certaines conditions spécifiques. Je dois passer la borne inférieure, la borne supérieure, le pointeur vers le tableau et l'élément de recherche. le programme que j'ai écrit m'a donné des avertissements. Je ne suis pas capable de corriger l'erreur dans le programme. S'il vous plaît pointez-moi où je me trompe.Recherche binaire avec pointeurs en 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;} 
} 

Je reçois cet avertissement lorsque je compile ceci.

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

lorsque je retire la ligne *p = a[0];, puis-je obtenir les messages d'erreur suivants:

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]| 

quand je lance le programme, le programme prend la valeur de l'élément de recherche et se termine après un certain temps. le contrôle n'est pas transféré à la fonction de recherche binaire.

+4

Pourquoi avez-vous introduit le tableau 'a'? Vous êtes censé chercher dans 'p' (et non le modifier).Vous êtes également censé retourner la position, pas "1" ou "-1". – molbdnilo

+2

Utilisez une liste d'initialisation à des fins de test. Si vous saisissez manuellement les données à chaque fois, il est facile de faire une erreur et d'entrer des données non triées, ou simplement des données différentes à chaque fois, ce qui rend le débogage difficile. En outre, cela rend le débogage ennuyeux lorsque vous passez la plupart de votre temps à entrer des choses. –

+2

Y a-t-il une bonne raison pour laquelle vous implémentez votre propre 'BinarySearch()' au lieu de simplement utiliser 'bsearch()' de ''? –

Répondre

2

Réfléchissons comment votre int BinarySearch(int l, int h, int *p, int x) devrait fonctionner:

  1. l,h sont les limites
  2. p est le pointeur de données (les données sont a[20] déclarées dans le principal: int n, i, a[20], h, l, x, r=0;)
  3. x est la valeur pour vérifier contre

Si p est le point ter à vos données, il n'est pas nécessaire (et il est en fait faux, car il ne cherchera pas les données que vous voulez) en déclarant un nouveau a[20] dans la fonction, ni dans *p = a[0];, puisque p pointe déjà vers la bonne adresse ... Supprimer ceux-ci, et utiliser if(p[mid] == x) au lieu de if(a[mid] == x)

2

Le tableau d'origine est définie à l'intérieur de main() et un réseau séparé est défini dans BinarySearch(). Le pointeur p est assigné à point à array défini dans main.

p = &a[0]; 

Le pointeur p est passé dans BinarySearch() et ensuite l'affectation

*p = a[0] 

est en fait modifier le contenu du pointeur de premier élément de nouveau tableau défini dans BinarySearch(). Le nouveau tableau n'est pas initialisé et, par conséquent, les avertissements du compilateur appropriés.

0

Les deux réponses précédentes semblent valables, mais la correction rapide au problème serait de réviser:

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

à

int mid, f =0; 

jour alors toutes les références à une fonction en BinarySearch à p.

Il n'est pas nécessaire d'allouer un tableau entier lorsque vous lisez simplement des données du tableau pointé par p.