подскажите, почему появляется эта ошибка? это касается указателей на функции

main.cpp

#include <iostream>
#include "prototipo.hpp"

using namespace std;

int main(){

int num_elem;
int minimo;

void (*compare)(int* x, int* y);
compare comp;
comp = swap;

cout << "Inserire numero di elementi: ";
cin >> num_elem;

int *pointA = new int[num_elem];

ordinamentoArray (pointA, num_elem, comp);

}

prototipo.hpp

#ifndef PROTOTIPO_HPP
#define PROTOTIPO_HPP

void ordinamentoArray (int pointA[], int num_elem, compare comp);
void swap(int* x,int* y);

#endif

corpo.cpp

#include <iostream>
#include "prototipo.hpp"

using namespace std;

void swap(int* x, int* y){

  int temp = *x;
  *x = *y;
  *y = temp;
}

void ordinamentoArray (int pointA[], int num_elem, compare comp){

  int indice;
  int indice2;
  int temp;

  for(indice=0; indice<num_elem; indice++){
    for(indice2=indice; indice2>0 && pointA[indice2]<pointA[indice2-1]; indice2--){

      if(pointA[indice2] < pointA[indice2-1]){
        comp(&pointA[indice2], &pointA[indice2-1]);
      }
    }
  }
}

Это ошибки, которые появляются. Среди них основная - "ошибка: не было объявлено сравнение". Честно говоря, я не знаю, в чем ошибка. Кто-нибудь может дать мне полезный совет по решению проблемы? Не знаю, может быть, я ошибся при объявлении указателя на функцию, или я ошибся, передав параметр

2 ответа

Решение

В этом объявлении функции

void ordinamentoArray (int pointA[], int num_elem, compare comp);

там используется имя compare это еще не было объявлено.

В функции main определен указатель (объект типа указателя) compare к типу функции void( int *, int *)

void (*compare)(int* x, int* y);

И затем этот объект, который не является спецификатором типа, используется в этом заявлении

compare comp;

это не имеет смысла.

Вы должны включить определение сравнения спецификатора типа в заголовок prototipo.hpp перед объявлением функции либо как

typedef void ( *compare )(int *, int *);

или как

using compare = void ( * )( int *, int * );

После того, как в основном удалите это объявление

void (*compare)(int* x, int* y);

Также выделенный массив, на который указывает указатель pointA

int *pointA = new int[num_elem];

передается функции неинициализированной

ordinamentoArray (pointA, num_elem, comp);

Обратите внимание: выглядит странным, что функция, которая что-то сравнивает, ничего не возвращает. Обычно такая функция в C++ возвращает объект, неявно конвертируемый в типbool.

ошибка: 'сравнить' не было объявлено

void (*compare)(int* x, int* y);
compare =swap;

или

typedef void (*compare)(int* x, int* y);
compare comp;
comp = swap;
Другие вопросы по тегам