1. ホーム
  2. c++

[解決済み] エラー:呼び出されたオブジェクト型 'int' は、関数または関数ポインタではありません。

2022-02-11 12:47:20

質問

ここに書いたクイックソートを持っています。

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.

すべて正しく見えます。何が間違っているのか、どなたか教えていただけませんか?

解決方法を教えてください。

ローカル変数 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) 変数名を変更する代わりに、プログラムの読者を混乱させることになります。