Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: called object type 'int' is not a function or function pointer

Tags:

c++

quicksort

I have a quicksort that I wrote here:

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

I tried compiling to an object file with g++ -g -c array.cpp -o array.o I get this error:

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

Everything looks correct. Can anyone help me figure out what is wrong?

like image 228
Pocketkid2 Avatar asked Nov 01 '13 18:11

Pocketkid2


2 Answers

Your local variable mid is declared in the scope that is closer to the point of use, so it "shadows" the mid() function; the compiler thinks that you are trying to "call" an integer, which is invalid. Rename the local variable to fix this problem:

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

Note: you could also use ::mid(lo, hi) instead of renaming the variable, but that would confuse the readers of your program.

like image 194
Sergey Kalinichenko Avatar answered Oct 31 '22 12:10

Sergey Kalinichenko


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

you can change the name of variable in the algorithm or use scope resolution operator ::mid(lo, hi) to access mid function previously defined in global scope

like image 3
4pie0 Avatar answered Oct 31 '22 13:10

4pie0