подскажите, почему появляется эта ошибка? это касается указателей на функции
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;