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?
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With