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

Tablica wskaźników do funkcji (c++)

VPS Starter Arubacloud
+1 głos
1,645 wizyt
pytanie zadane 24 lutego 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam napisałem program, którego kod pokaże poniżej. Wystąpiły dwa błędy z konwersją, które również pokaże. Próbowałem samodzielnie rozwiązać ten problem jednak nie skutecznie.

 

Kod:

#include <iostream>

void * m1(double y, double u);
void * m2(double c, double d);
void * m3(double a, double b);

void (*add[3])(double x, double y);
void calculate(double p, double m, double (*add[3])(double, double));

int main()
{
        double l, k;
        for(int i=0; i<3; i++)
        {
                std::cout << "Podaj wartosc: ";
                std::cin >> l;
                std::cout << "Podaj wartosc: ";
                std::cin >> k;
                calculate(l, k, add[3]);
        }

        return 0;
}

void * m1(double y, double u) { std::cout << y + u << std::endl; }
void * m2(double c, double d) { std::cout << c - d << std::endl; }
void * m3(double a, double b) { std::cout << a * b << std::endl; }

void calculate(double p, double m, void (*add[3])(double, double))
{
        add[3] = {m1, m2, m3};
        for(int i=0; i<3; i++)
                add[i](p,m);
}
Błędy:
start_c.cpp: In function ‘int main()’:
start_c.cpp:20:25: error: cannot convert ‘void (*)(double, double)’ to ‘double (**)(double, double)’ for argument ‘3’ to ‘void calculate(double, double, double (**)(double, double))’
   calculate(l, k, add[3]);
                         ^
start_c.cpp: In function ‘void calculate(double, double, void (**)(double, double))’:
start_c.cpp:32:22: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘void (*)(double, double)’ in assignment
  add[3] = {m1, m2, m3};

 

1 odpowiedź

+3 głosów
odpowiedź 24 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 24 lutego 2018 przez Sic
 
Najlepsza

Namieszałeś ze wskaźnikami i typami danych:

1. Linia 7 i 8. To jakiego typu mają być funkcje? Zwracające double czy void?

2. Linia 3 do 5. Chcesz zwracać void * z funkcji? 

3. Linia 25-27. Znowu void *? Definicja funkcji jest równocześnie jej adresem co widać w kodzie poniżej.

4. Linia 31. Nie. Tak się nie da :-/

#include <iostream>
 
void m1(double y, double u);
void m2(double c, double d);
void m3(double a, double b);
 
void (*add[3])(double x, double y) = { m1, m2, m3 };
void calculate(double p, double m, void (*add[3])(double, double));
 
int main()
{
        double l, k;
        for(int i=0; i<3; i++)
        {
                std::cout << "Podaj wartosc: ";
                std::cin >> l;
                std::cout << "Podaj wartosc: ";
                std::cin >> k;
                calculate(l, k, add);
        }
 
        return 0;
}
 
void m1(double y, double u) { std::cout << y + u << std::endl; }
void m2(double c, double d) { std::cout << c - d << std::endl; }
void m3(double a, double b) { std::cout << a * b << std::endl; }
 
void calculate(double p, double m, void (*add[3])(double, double))
{
	// Nie możesz przypisać tak tablicy wskaźników
        //add[3] = { m1, m2, m3};
        // Zrobiłem to w linii 7 w trakcie deklaracji.
        for(int i=0; i<3; i++)
                add[i](p,m);
}

 

komentarz 24 lutego 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję.

1.Tylko dlaczego nie mogłem w linii 31 przypisać w ten sposób tablicy wskaźników?

2. dlaczego w liniach 3-5 m1, m2, m3 to zwykłe funkcje ?

3. I jeszcze jedno dlaczego w linii 19 wywołanie funkcji calculate() jest "samo" add bez "[3]" ?
2
komentarz 24 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
Ad 1.

add[3] jest wartością z tablicy. Nawiasem mówiąc poza tą tablicą bo max index to 2.

Ad 2.

C i C++ w sposób naturalny traktuje definiowaną funkcję jako jej wskaźnik.

Ad 3.

add jest tablicą więc i wskaźnikiem na dane a więc pasuje do typu w deklaracji funkcji calculate(...) . Jeśli przekażesz tam add[3] to będzie element o indeksie 3 z tej tablicy (znów.. poza poprawnymi indeksami).
komentarz 24 lutego 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję Ci, że mi to wytłumaczyłeś miałem z tym duży problem.

Podobne pytania

0 głosów
1 odpowiedź 1,402 wizyt
0 głosów
3 odpowiedzi 666 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...