Czesc moglby ktos mi wytlumaczyc jak sie tworzy wskaznik na funkcje przy okazji wykonac to zadanie?
Wytłumaczyć, mogę spróbować. Zrobić zadanie nie.
Jeśli masz funkcję, to jej kod rezyduje gdzieś w pamięci. Możesz uzyskać do niej dostęp poprzez wskaźnik który jest jej adresem. Z racji tego że w C jak i w C++ taki wskaźnik jest traktowany jak sama funkcja, będziesz mógł ją zawołać bezpośrednio przekazując argumenty i uzyskać wynik.
Ważna sprawa. Wskaźnik na funkcję, jest inną kategorią wskaźnika niż wskaźnik na dane/zmienną/obiekt. Nie wolno Ci rzutować z jednego wskaźnika inny rodzaj (wskaźnik na "nie funkcję") bo zawsze będziesz miał zachowanie niezdefiniowane.
Taki wskaźnik tworzy się bardzo prosto:
#include <iostream>
int calc(int a, int b) {
return a + b;
}
int main() {
// Wskaźnik o nazwie funPtr na funkcję zwracającą int i przyjmującą dwa arg. typu int
int (*funPtr)(int, int) = calc;
// Nie jest konieczne dopisywanie & przed nazwą funkcji np. tak:
// int (*funPtr)(int, int) = &calc;
// Wywołanie funkcji
int result = funPtr(4, 5);
// Znów, nie jest konieczne stawianie wyłuskania takiego wskaźnika np. tak:
// int result = (*funPtr)(4, 5);
std::cout << result << '\n';
}
Jeśli chcesz przesłać dany wskaźnik na funkcję do innej funkcji, to wystarczy to zrobić tak:
#include <iostream>
int calc(int a, int b) {
return a + b;
}
void showCalc(int (*fun)(int, int), int arg1, int arg2) {
std::cout << fun(arg1, arg2) << '\n';
}
int main() {
showCalc(calc, 4, 5);
}
Jeśli z jakiegoś powodu (np. funkcja ma wiele argumentów, ma rozbudowany typ danych zwracany...), nie pasuje Ci taki zapis wskaźnika na funkcję, możesz do niej dodać inną nazwę która nie jest niczym innym niż tylko innym nazwaniem wskaźnika na funkcję. Taka nazwa nie tworzy innego bytu a jedynie ułatwia zapis:
#include <iostream>
using calcPtr = int(*)(int, int);
int calc(int a, int b) {
return a + b;
}
void showCalc(calcPtr fun, int arg1, int arg2) {
std::cout << fun(arg1, arg2) << '\n';
}
int main() {
showCalc(calc, 4, 5);
}
To Ci wystarczy do rozwiązania zadania plus wiedza o tym że jest funkcja zwracająca wartość bezwzględną std::abs(...).