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

funkcja jako parametr funkcji

Aruba Cloud - Virtual Private Server VPS
–1 głos
1,875 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 Mentor (352,580 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,440 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 Mentor (352,580 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 (195,240 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ź 201 wizyt
pytanie zadane 14 kwietnia 2018 w C i C++ przez zibiken Początkujący (310 p.)
0 głosów
0 odpowiedzi 138 wizyt
pytanie zadane 30 października 2017 w JavaScript przez Perkos Początkujący (290 p.)
0 głosów
1 odpowiedź 677 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez JSJerry Początkujący (260 p.)

93,334 zapytań

142,328 odpowiedzi

322,406 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...