• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

funkcja jako parametr funkcji

Object Storage Arubacloud
–1 głos
1,636 wizyt
pytanie zadane 15 lutego 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
edycja 15 lutego 2018 przez Patrycjerz

Witam, nie biorąc pod uwagę obecnego stanu kodu, ponieważ były w nim liczne modyfikacje mam problem z wywołaniem funkcji, której jednym z parametrów jest inna funkcja.

#include <iostream>

double add (double x, double y);
double calculate (double p, double m, double * (fun));

int main()
{
        double l, k;
        for(int i=0; i<3; i++)
        {
                std::cout << "Podaj wartosc 1: ";
                std::cin >> l;
                std::cout << "Podaj wartosc 2: ";
                std::cout << k;

                double p = calculate(l, k, add);
        }
        return 0;
}

double add (double x, double y)
{
        return x + y;
}

double calculate (double p, double m, double * (fun))
{
        double q = add (p, m);

        return q;
}

 

1
komentarz 15 lutego 2018 przez adrian17 Ekspert (344,860 p.)

std::cout << k;

Tu raczej powinno być `cin`.

4 odpowiedzi

+2 głosów
odpowiedź 15 lutego 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
wybrane 16 lutego 2018 przez Sic
 
Najlepsza

Krótko i na temat:

Podajesz błędny typ dla przekazywanej funkcji. Zamiast

double * (fun)

w deklaracji i definicji funkcji calculate powinno być

double (*fun)(double, double)

Jeżeli masz Symfonię C++ Grębosza, to jest tam dość fajnie napisane jak tworzyć definicje odpowiednich wskaźników na funkcje. Jeśli nie, to przyjrzyj się powyższemu przykładowi i spróbuj na jego podstawie to przećwiczyć tworząc wskaźniki służące do "pokazywania" na funkcje innego typu - wtedy załapiesz w mig.

---

double calculate (double p, double m, double (*fun)(double, double))
{
        double q = add (p, m); 
 
        return q;
}

Tutaj zawsze wywołujesz funkcję add, a chcesz wywołać funkcję przekazywaną przez wskaźnik, a więc poprawnie powinno być:

double q = fun(p, m); 

Pozdrawiam! smiley

+1 głos
odpowiedź 15 lutego 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

wydaje mi się że źle zadeklarowałeś wskaźnik do funkcji. Powinno być

double calculate (double p, double m, double * (fun));
//zamień na 
double calculate (double p, double m, double (*fun)(int, int));

double (*fun)() -> to wskaźnik na funkcje co ma pustą listę argumentów a zwraca double

double (*fun)(int, int) -> to wskaźnik na funkcje co ma dwa argumenty int i  zwraca double

0 głosów
odpowiedź 15 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
Skoro piszesz w C++, a nie w C, używaj klasy std::function w taki sposób:
http://coliru.stacked-crooked.com/a/c67308d6f84e98bc
Obiekt taki, przyjmuje zwykłą funkcję i functor(lambda).
2
komentarz 15 lutego 2018 przez adrian17 Ekspert (344,860 p.)

Skoro piszesz w C++, a nie w C, używaj klasy std::function w taki sposób:

To nie jest tak, że "jeśli C++ to std::function jest obiektywnie lepszym zamiennikiem wskaźnika"; są sytuacje gdy potrzebujesz std::function, ale w tym przypadku tak nie jest.

Można użyć `using`, z którym deklarowanie wskaźników na funkcje jest dość czytelne:

using Fun = double(double, double);

double calculate (double p, double m, Fun *fun);

 

1
komentarz 15 lutego 2018 przez j23 Mędrzec (194,920 p.)

Jak już robić alias, to dobrze też byłoby pozbyć się *:

using Fun = double (*)(double, double);
 
double calculate (double p, double m, Fun fn) { return fn(p, m); }

 

 

 

1
komentarz 15 lutego 2018 przez Knayder Nałogowiec (37,640 p.)

zawsze można zrobić po prostu tak:
 

template<typename T>
void func(T func)

 

1
komentarz 15 lutego 2018 przez draghan VIP (106,230 p.)

Jak już robić alias, to dobrze też byłoby pozbyć się *:

Zaletą rozwiązania podrzuconego przez adrian17 jest jego przejrzystość i prostota. Nie musisz pamiętać, jak dokładnie rozlokować nawiasy.

0 głosów
odpowiedź 16 lutego 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję Wam wszystkim za pomoc i za ukazanie mi wszystkich możliwości. Moje umiejętności jeszcze nie pozwalają w pełni na wykorzystanie ich wszystkich jednak zrobię wszystko aby się tego nauczyć.

Podobne pytania

0 głosów
1 odpowiedź 164 wizyt
pytanie zadane 14 kwietnia 2018 w C i C++ przez zibiken Początkujący (310 p.)
0 głosów
0 odpowiedzi 115 wizyt
pytanie zadane 30 października 2017 w JavaScript przez Perkos Początkujący (290 p.)
0 głosów
1 odpowiedź 607 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez JSJerry Początkujący (260 p.)

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...