web-dev-qa-db-fra.com

erreur: le type d'objet appelé 'int' n'est pas une fonction ou un pointeur de fonction

J'ai un tri rapide que j'ai écrit ici:

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

J'ai essayé de compiler dans un fichier objet avec g++ -g -c array.cpp -o array.o J'obtiens cette erreur:

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

Tout semble correct. Quelqu'un peut-il m'aider à comprendre ce qui ne va pas?

16
Pocketkid2

Votre variable locale mid est déclarée dans la portée qui est la plus proche du point d'utilisation, donc elle "assombrit" la fonction mid(); le compilateur pense que vous essayez "d'appeler" un entier, ce qui n'est pas valide. Renommez la variable locale pour résoudre ce problème:

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

Remarque: vous pouvez également utiliser ::mid(lo, hi) au lieu de renommer la variable, mais cela dérouterait les lecteurs de votre programme.

23
dasblinkenlight
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

vous pouvez changer le nom de la variable dans l'algorithme ou utiliser l'opérateur de résolution de portée ::mid(lo, hi) pour accéder à la fonction mid précédemment définie dans la portée globale

1
4pie0