Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
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.