NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pole ukazatelů na funkce volané z argumentu funkce

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jaroslav Dubánek:21.10.2017 12:05

Ahoj, prosil bych o radu, jakou dělám chybu ve volání ukazetele na funkci v poli.

#include <iostream>

using namespace std;

double add(double, double);

double sub(double, double);

double calculate(double, double, double (*fp[2])(double, double));

int main()
{
    double (*fp[])(double, double) = {add, sub};
    double ipa, ipb, ipc;
    double q;
    do
    {
        cout << "Zadej prvni cislo: ";
        if (!(cin >> ipa))
            break;
        cout << "Zadej druhe cislo: ";
        if (!(cin >> ipb))
            break;
        cout << "Chces scicat\t0)\nnebo odcitat\t1)\n";
        if (!(cin >> ipc))
            break;

        if (ipc == 0)
            q = calculate(ipa, ipb, fp[0]); // tady dělám chybu ve volání, ale nevím jakou
        else if (ipc == 1)
            q = calculate(ipa, ipb, fp[1]);

        else
            break;
        cout << "Vysledek: " << q << endl << endl;
    } while (cin);
    return 0;
}

double calculate(double a, double b, double (*fp[2])(double, double))
{
    return (*fp[])(a, b);
}

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

double sub(double x, double y)
{
    return x - y;
}
Odpovědět
21.10.2017 12:05
Život je ve skutečnosti strašně jednoduchej.
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Jaroslav Dubánek
gcx11:21.10.2017 12:33
#include <iostream>

using namespace std;

double add(double, double);

double sub(double, double);

double calculate(double, double, double (*fp[2])(double, double));

int main()
{
    double (* fp [])(double, double) = {add, sub};
    double ipa, ipb, ipc;
    double q;
    do
    {
        cout << "Zadej prvni cislo: ";
        if (!(cin >> ipa))
            break;
        cout << "Zadej druhe cislo: ";
        if (!(cin >> ipb))
            break;
        cout << "Chces scicat\t0)\nnebo odcitat\t1)\n";
        if (!(cin >> ipc))
            break;

        if (ipc == 0)
            q = calculate(ipa, ipb, &fp[0]); // tady dělám chybu ve volání, ale nevím jakou
        else if (ipc == 1)
            q = calculate(ipa, ipb, &fp[1]);

        else
            break;
        cout << "Vysledek: " << q << endl << endl;
    } while (cin);
    return 0;
}

double calculate(double a, double b, double (*fp[2])(double, double))
{
    return (*fp[2])(a, b);
}

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

double sub(double x, double y)
{
    return x - y;
}

Pak tam máš nějakou chybu v načítání.

 
Nahoru Odpovědět
21.10.2017 12:33
Avatar
Odpovídá na gcx11
Jaroslav Dubánek:22.10.2017 12:14

Díky, gcx11.

Co myslíš načítáním? Ještě nejsem úplně zběhlej v český hovorový ani moc v profesionální terminologii.

Ten & tam přidávám proč? Já myslel, že stačí volat pole s indexem, kde je adresa pole už uložená. Ukazatele jsou fakt nářez, ale baví mě to.

Stále bádám, tápu. Když na to přijdu, hned to sem napíšu.

Nahoru Odpovědět
22.10.2017 12:14
Život je ve skutečnosti strašně jednoduchej.
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Jaroslav Dubánek
gcx11:22.10.2017 13:56

Aha, tak jsi nakonec měl špatně to předávání funkce, toto je správná verze:

#include <iostream>

using namespace std;

double add(double, double);

double sub(double, double);

double calculate(double, double, double (* fp )(double, double));

int main()
{
    double (* fp[] )(double, double) = {add, sub};
    double ipa, ipb, ipc;
    double q;
    do
    {
        cout << "Zadej prvni cislo: ";
        if (!(cin >> ipa))
            break;
        cout << "Zadej druhe cislo: ";
        if (!(cin >> ipb))
            break;
        cout << "Chces scicat\t0)\nnebo odcitat\t1)\n";
        if (!(cin >> ipc))
            break;

        if (ipc == 0)
            q = calculate(ipa, ipb, fp[0]); // tady dělám chybu ve volání, ale nevím jakou
        else if (ipc == 1)
            q = calculate(ipa, ipb, fp[1]);

        else
            break;
        cout << "Vysledek: " << q << endl << endl;
    } while (cin);
    return 0;
}

double calculate(double a, double b, double (*fp)(double, double))
{
    return (*fp)(a, b);
}

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

double sub(double x, double y)
{
    return x - y;
}

Jsi tam místo funkce, která se má volat předával to pole s funkcemi.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.10.2017 13:56
Avatar
Jaroslav Dubánek:23.10.2017 18:11

Tak už jsem to rozchodil. Tady je kód nekonečné vytrvalosti:

#include <iostream>

using namespace std;

double add(double, double);

double sub(double, double);

double calculate(double, double, double (*fp)(double, double));

int main()
{
    double (*fp[])(double, double) = {add, sub};
    double ipa, ipb, ipc;
    double q;
    do
    {
        cout << "Zadej prvni cislo: ";
        if (!(cin >> ipa))
            break;
        cout << "Zadej druhe cislo: ";
        if (!(cin >> ipb))
            break;
        cout << "Chces scicat\t1)\nnebo odcitat\t2)\n";
        if (!(cin >> ipc))              // musel jsem tady zmenit cisla
            break;                              // 0) a 1) na jine hodnoty, protoze
                                                // cin == 0 je vlastne false
        if (ipc == 1)
            q = calculate(ipa, ipb, fp[0]);
        else if (ipc == 2)
            q = calculate(ipa, ipb, fp[1]);

        else
            break;
        cout << "Vysledek: " << q << endl << endl;
    } while (cin);
    return 0;
}

double calculate(double a, double b, double (*fp)(double, double))
{
    return (*fp)(a, b);
}

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

double sub(double x, double y)
{
    return x - y;
}
Nahoru Odpovědět
23.10.2017 18:11
Život je ve skutečnosti strašně jednoduchej.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.