Dynamiczna kolejność wykonywania funkcji

0

Jak mam 4 funkcje to jak ustalić w programie dynamicznie kolejność ich wykonywania. Np. użytkownik w programie wybrał, żeby najpierw zrealizowana została funkcja2, potem funkcja4, potem funkcja1 i na końcu funkcja3. To czy da radę wepchnąć te 4 funkcje do jakieś procedury, która będzie ustalała porządek coś w stylu?

funkcja(vector<int> porzadek)
{
W zależności jaką wartość mają porządek[0-3] wykonaj w odpowiedniej kolejności funkcje: funkcja1, funkcja2, funkcja3, funkcja4
}
,gdzie:
porządek[0]=2 oznacza, że funkcja1 zostanie wykonana jako druga
porzadek[1]=1 oznacza, że funkcja2 zostanie wykonana jako pierwsza
porzadek[2]=3 itd.
porzadek[4]=4

0

Możesz zrobić tablicę wskaźników do funkcji i potem je odpalać z tej tablicy.

0

@clydeF: czemu nie wpadłeś, żeby zrobić tą tablicę odwrotnie, kolejne elementy tablicy oznaczą którą funkcję uruchomić. Elementami tej tablicy mogą być wskaźniki na funkcję (wersja pro), albo wypełnić enum'em (wersja safe and easy).

np:

enum MojeFunkcje {
    Fun1,
    Fun2,
    Fun3
};


void wykonajSekwencje(const vector<MojeFunkcje>& sekwencja)
{
    for_each(MojeFunkcje fun, sekwencja) {
        switch(fun) {
            case Fun1:
                RunFun1();
                break;
            case Fun2:
                RunFun2();
                break;
            case Fun3:
                RunFun3();
                break;
            default:
                cerr << "nieznana metoda";
        }
    }
}
0

@up to C++ dorobiło sie pętli for_each? :)

0

Niestety nie kompiluje czegoś takiego:

enum MojeFunkcje {
    Fun1(jakieś parametry);
    Fun2(parametry);
    Fun3(parametry);
};

Wyświetla się błąd error C2143: syntax error : missing '}' before '('. Poza tym nie rozumiem kodu jak niby z tego powyżej dowolną kolejność można uzyskać wykonywania funkcji. Inaczej może, bo tak to to nie mam szans zrozumieć tego mega poziomu abstrakcyjności, więc może na przykładzie:
vector<int> porzadek;
printf("Podaj kolejność wykonywania funkcji (liczby 0-3):\n"):
printf("Funkcja1: ");
scanf("%d",&porzadek[0]);
printf("\nFunkcja2: ");
scanf("%d",&porzadek[1]);
printf("\nFunkcja3: ");
scanf("%d",&porzadek[2]);
printf("\nFunkcja4: ");
scanf("%d",&porzadek[3]);
//Zakładamy, że ktoś wpisał kombinację taką:
//porzadek[0]=3, porzadek[1]=1, porzadek[2]=2, porzadek[3]=0 gdzie 0 oznacza, że funkcja
//wykonywana jako pierwsza, 1 jako druga itd.

I jak dalej wygląda kod?

0

Już zauważyłem błąd, ale mimo poprawności enuma i tak ten sam komunikat wyskakuje.

enum MojeFunkcje {
    Fun1(jakieś parametry),
    Fun2(parametry),
    Fun3(parametry)
};
0

enum MojeFunkcje {
Fun1(jakieś parametry),
Fun2(parametry),
Fun3(parametry)
};

Tu nie powinny być deklaracje funkcji. Mają być identyfikatory po których po prostu rozpoznajesz, którą funkcję uruchamiać. Tak jak w kodzie podanym przez MarekR22.

0
Shalom napisał(a)

@up to C++ dorobiło sie pętli for_each? :)

W sumie to nie, to jest makro, nawet niestandardowe :) (klepie teraz w Qt), ale bardziej chodziło mi o filozofię, a nie dosłowny kod.

@clydeF: rozumu trzeba trochę, a nie na głupa coś robić:

enum MojeFunkcje {
    StalaReprezentujacaFun1,
    StalaReprezentujacaFun2,
    StalaReprezentujacaFun3
};


void wykonajSekwencje(const vector<MojeFunkcje>& sekwencja)
{
    vector<MojeFunkcje>::const_iterator i; // dla purystów C++ :P
    for(i = sekwencja.begin(); i!=sekwencja.end(); ++i ) {
        switch(*i) {
            case StalaReprezentujacaFun1:
                wlasciwaFunkcja1(jakisParametr);
                break;
            case StalaReprezentujacaFun2:
                wlasciwaFunkcja2(innyParametr, dodatkowyParametr);
                break;
            case StalaReprezentujacaFun3:
                wlasciwaFunkcja3();
                break;
            default:
                cerr << "nieznana metoda";
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1