2013-11-01 41 views
16

ではない私は、私がここに書いたクイックソートを持っている:エラー:呼び出されたオブジェクトの型「intは」関数または関数ポインタ

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

私はこのエラーを取得するg++ -g -c array.cpp -o array.o とオブジェクトファイルにコンパイルしてみました:

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

すべて正しく表示されます。誰が私が何が間違っているか把握するのを助けること

+5

グローバルスコープで定義されたmid機能にアクセスするために、スコープ解決演算子::mid(lo, hi)を使用しますが、 '半ばをint型で宣言することができます;'しかし、HI、LO( '半ばを呼び出します) '... – chris

答えて

22

ローカル変数midは、使用場所に近いスコープで宣言されているため、mid()関数を「陰影付け」します。コンパイラは、無効な整数を「呼び出し」しようとしていると考えます。この問題を解決するために、ローカル変数の名前を変更します。

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

注:また、変数の名前を変更するのではなく、::mid(lo, hi)を使用することができますが、それはあなたのプログラムの読者を混乱させる。

+0

+1。もちろん、名前を変更する代わりに ':: mid'を使用して関数を参照することもできます。 – Angew

+0

ありがとう!これは助けになった。私はもともとピボットと呼ばれる変数とピボット関数()を持っていました。問題を解決しようとグローバル検索と置換を行ったとき、変数も変更されているのを忘れてしまいました。 – Pocketkid2

+0

@Angew優れた点をありがとう!私はこれに言及する答えを編集しました。 – 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 

あなたは、アルゴリズムに変数の名前を変更したり、以前に

関連する問題