2017-10-05 4 views
-4
// RecursiveBinarySearch.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#define N 9 

int RecursiveBinarySearch(int A, int low, int high, int x); 

int main() 
{ 
    int A[N]; 
    int index = 0; 
    //Put 
    A[0] = 2; 
    A[1] = 6; 
    A[2] = 13; 
    A[3] = 21; 
    A[4] = 36; 
    A[5] = 47; 
    A[6] = 63; 
    A[7] = 81; 
    A[8] = 97; 

    printf("Elements in Array A\n"); 

    while (index <= 8) { 
     printf("%d ", A[index]); 
     index++; 
    } 

    printf("\nLocation(index) of element 63\n"); 

    printf("%d", RecursiveBinarySearch(A, 0, 8, 63)); 

    return 0; 
} 


int RecursiveBinarySearch(int A, int low, int high, int x) { 

    //Base Condition 
    if (low > high) 
     return -1; 

    int mid = low + (high - low)/2; 

    if (x == A[mid]) 
     return mid; 
    else if (x < A[mid]) 
     return RecursiveBinarySearch(A, low, mid - 1, x); 
    else 
     return RecursiveBinarySearch(A, mid + 1, high, x); 

} 

Hier ist das erste Problem. Visual Studio sagt int A [9] Argumente vom Typ "int *" mit Parametern vom Typ "int" nicht kompatibel sindrekursive binäre Suche c

Hier zweites Problem. int mid Ausdruck muss Zeiger-Objekt-Typ haben

Ich weiß nicht gut über Zeiger, also möchte ich wissen, warum dieser Code nicht kompiliert werden kann und wie Zeiger in diesem Code verwenden.

+2

Bitte nehmen Sie sich die Zeit, ein gutes Buch über C zu lesen. Ein Array ('int []') ist nicht dasselbe wie ein einzelnes 'int'. Was haben Sie erwartet, wenn Sie ein Array übergeben, bei dem Ihre Funktion nur a erwartet Wert? –

+2

Ändern Sie die Deklaration von Argument A in "int * A" –

+0

(mit Fehlermeldungen einschließlich Zeilennummern, bitte geben Sie diese Nummer in Ihrem Zitat. Wenn Sie auf Elemente aus Code in Ihrem Beitrag enthalten, ist es leichter zu lesen, wenn Sie sie machen Mit "Backticks" abheben: 'int A [9]', 'int mid'v) – greybeard

Antwort

2

Bessere alle assignements entfernen A[0] = ..., A[1] = ... alltogether und schreiben:

int A[] = {2,6,13,21,36,47,63,81,97} 

Und ersetzen

while (index <= 8) 

von:

while (index < sizeof(A)/sizeof(A[0])) 

sizeof(A)/sizeof(A[0]) ist die Anzahl der Elemente, wenn das Array A. sizeof(A) ist die Größe in Byte des gesamten Arrays und ist die Größe eines Elements des Arrays in Bytes.


Aber das eigentliche Problem ist hier:

ersetzen:

int RecursiveBinarySearch(int A, int low, int high, int x) 

von

int RecursiveBinarySearch(int A[], int low, int high, int x) 

Es kann jedoch mehr Fehler sein.

1

Beginn der Einnahme von Compiler-Warnungen ernst:

helpPointer.c: In function ‘main’: 
helpPointer.c:30:40: warning: passing argument 1 of ‘RecursiveBinarySearch’ makes integer from pointer without a cast [-Wint-conversion] 
    printf("%d", RecursiveBinarySearch(A, 0, 8, 63)); 
             ^
helpPointer.c:4:5: note: expected ‘int’ but argument is of type ‘int *’ 
int RecursiveBinarySearch(int A, int low, int high, int x); 
    ^~~~~~~~~~~~~~~~~~~~~ 

Wie bereits von den Menschen in Kommentaren darauf, sind Sie ein Array in rekursive binäre Suchverfahren vorbei, so dass Sie RecursiveBinarySearch wie sich dies ändern sollte:

int RecursiveBinarySearch(int A[], int low, int high, int x); 

Oder

int RecursiveBinarySearch(int *A, int low, int high, int x); 

die ein und dasselbe, si sind Der Name des NCE-Arrays ist nur ein Zeiger, der auf das erste Element des Arrays zeigt. Lesen Sie this, wenn Sie nicht viel Ahnung über die Beziehung zwischen Array und Zeigern haben.