2013-11-01 11 views
16

Ho un Quicksort che ho scritto qui:errore: chiamato tipo di oggetto 'int' non è una funzione o una funzione puntatore

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); 
} 

Ho provato la compilazione di un file oggetto con g++ -g -c array.cpp -o array.o ottengo questo errore:

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

Tutto sembra corretto. Qualcuno può aiutarmi a capire cosa c'è che non va?

+5

È dichiarato 'int metà;' ma chiamare 'metà (lo, hi) '... – chris

risposta

22

La variabile locale mid è dichiarata nell'ambito che è più vicina al punto di utilizzo, pertanto "ombreggia" la funzione mid(); il compilatore pensa che tu stia cercando di "chiamare" un intero, che non è valido. Rinominare la variabile locale per risolvere questo problema:

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]; 
    ... 
} 

Nota: si potrebbe anche usare ::mid(lo, hi) invece di rinominare la variabile, ma che sarebbe confondere i lettori del tuo programma.

+0

+1. Ovviamente, l'alternativa alla ridenominazione sarebbe usare ':: mid' per riferirsi alla funzione. – Angew

+0

Grazie! questo ha aiutato Inizialmente avevo avuto la variabile chiamata pivot e la funzione pivot() e quando ho fatto un search-and-replace globale per provare a risolvere il problema ho dimenticato di notare che anche la variabile è cambiata. – Pocketkid2

+0

@Angew Grazie per un eccellente punto! Ho modificato la risposta per menzionarlo. – 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 

è possibile cambiare il nome della variabile nel algoritmo o utilizzare operatore di risoluzione dell'ambito ::mid(lo, hi) per accedere mid funzione precedentemente definita in ambito globale

Problemi correlati