2013-11-01 10 views
16

Ich habe einen quicksort, die ich hier schrieb:Fehler: Objekttyp ‚int‘ genannt wird, ist nicht eine Funktion oder ein Funktionszeiger

void swap(int& a, int& b); 
int mid(int lo, int hi); 

// My quicksort implementation 
void sort(int vec[], int lo, int hi) 
{ 
     int mid; 
     if (hi > lo) { 
       int i = lo + 1; 
       int j = hi; 
       int p = mid(lo, hi); 
       swap(vec[lo], vec[p]); 
       mid = vec[lo]; 
       while (i < j) { 
         if (vec[i] <= mid) { 
           i++; 
         } else { 
           while (i < --j && vec[j] >= mid); 
           swap(vec[i], vec[j]); 
         } 
       } 
       i++; 
       swap(vec[lo], vec[i]); 
       sort(vec, lo, i); 
       sort(vec, j, hi); 
     } 
} 

void swap(int& a, int& b) 
{ 
     int temp = a; 
     a = b; 
     b = temp; 
} 

int mid(int lo, int hi) 
{ 
     return lo + ((hi - lo)/2); 
} 

ich mit g++ -g -c array.cpp -o array.o ich diesen Fehler zu einer Objektdatei versucht Kompilieren:

array.cpp:24:14: error: called object type 'int' is not a function or function 
    pointer 
      int p = mid(lo, hi); 
        ~~~^ 
1 error generated. 

Alles sieht korrekt aus. Kann mir jemand helfen herauszufinden, was falsch ist?

+5

Sie erklärt 'int Mitte,' aber rufen 'mid (lo, hallo) '... – chris

Antwort

22

Ihre lokale Variable mid wird in dem Bereich deklariert, der näher an der Verwendungsstelle liegt, so dass sie die mid()-Funktion "beschattet"; Der Compiler denkt, dass Sie versuchen, eine Ganzzahl "aufzurufen", die ungültig ist. Benennen Sie die lokale Variable dieses Problem zu beheben:

int midpoint; 
if (hi > lo) { 
    int i = lo + 1; 
    int j = hi; 
    int p = mid(lo, hi); 
    swap(vec[lo], vec[p]); 
    midpoint = vec[lo]; 
    ... 
} 

Hinweis: Sie auch ::mid(lo, hi) statt Umbenennung der Variable verwenden könnte, aber das würde die Leser Ihres Programms verwirren.

+0

+1. Natürlich wäre die Alternative zum Umbenennen die Verwendung von ':: mid', um auf die Funktion Bezug zu nehmen. – Angew

+0

Danke! Das hat geholfen. Ich hatte ursprünglich die Variable Pivot und die Funktion pivot() und als ich eine globale Suche-und-ersetzen, um zu versuchen, das Problem zu beheben, habe ich vergessen zu bemerken, dass die Variable auch geändert. – Pocketkid2

+0

@Angew Danke für einen ausgezeichneten Punkt! Ich habe die Antwort bearbeitet, um dies zu erwähnen. – dasblinkenlight

1
int mid(int lo, int hi);  // here you declared mid as function and defined 
           // it later 
// My quicksort implementation 
void sort(int vec[], int lo, int hi) 

{ 
int mid;      // but here you declared mid as local variable 
if (hi > lo) {    // it will shadow int mid(int lo, int hi); 
     int i = lo + 1; 
     int j = hi; 
     int p = mid(lo, hi); // so this is error, mid is integer not a function 

können Sie den Namen der Variablen in dem Algorithmus ändern oder Bereichsauflösungsoperator ::mid(lo, hi) verwenden mid Funktion für den Zugriff auf zuvor im globalen Bereich definiert