• 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++)

Object Storage Arubacloud
+1 głos
1,673 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,451 wizyt
0 głosów
3 odpowiedzi 723 wizyt

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 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!

...