Avatar
Nikolai
Člen
Avatar
Nikolai:29. července 18:11

Pokiaľ by sa tu niekto našiel, bol by som veľmi rád kto by mi dokázal vysvetliť niektoré veci ohľadom tohto kódu

typedef int(*IntFunctionWithOneParameter) (int a);

int function(int a) { return a; }
int functionTimesTwo(int a) { return a * 2; }
int functionDivideByTwo(int a) { return a / 2; }

void main()
{
        IntFunctionWithOneParameter functions[] =
        {
                function,
                functionTimesTwo,
                functionDivideByTwo
        };

        for (int i = 0; i < 3; ++i)
        {
                cout << functions[i](8) << endl;
        }
}

Tu je taktiež aj odkaz na stránku kde som kód našiel.

Pravde povediac neviem ani ako som sa k tomu článku dostal, len ako som si čítal ten kód mám tam určité nejasnosti ktoré by som bol rád keby mi niekto mohol vysvetliť.

1)
Asi prvá vec ktorá mi je nejasná a neviem či ju dobre chápem je tento riadok kódu:

typedef int(*IntFunctionWithOneParameter) (int a);

Chápem časti kedy vytvárame nový alias pre dátový typ int s názvom IntFunctionWit­hOneParameter ktorý je zadeklarovaný ako ukazateľ (Pokiaľ to tak nie je opravte ma prosím).

Avšak nie som si istý tým či tento alias s názvom IntFunctionWit­hOneParameter je vlastne deklarácia funkcie, ktorá preberá jeden parameter dátového typu int alebo to vlastne ani funkcia nie je ? Tu si naozaj nie som istý a práve na toto chcem spýtať.

2)
Ďalej mi nie je celkom jasný riadok

IntFunctionWithOneParameter functions[] = {...}

Tu to chápem tak že IntFunctionWit­hOneParameter je zadeklarovaný ako ukazateľ, takže pred dátové pole (array) už nie je nutné používať operátor hviezdičky(*). Chápem to správne ? (Pokiaľ nie poprosil by som aby ma niekto opravil)

Avšak prečo som hlavne tu, je tento riadok kódu

... functions[i](8) ...

Ako môže dátové pole functions[i] preberať parameter (8), keď pri jeho deklarácii

IntFunctionWithOneParameter functions[] = {...}

nebolo zadeklarované aby preberal akékoľvek parametre ? Toto mi nie je naozaj jasné. Platí snáď to že pokiaľ je
toto pole (array) zadeklarované pod "dátovým typom" IntFunctionWit­hOneParameter zdieľa jeho parametre a môže ich používať ? Toto by som vás naozaj poprosil vysvetliť.

3)
Nakoniec som ešte skúšal zmeniť funckiu

int function(int a) { return a; }

aby nevracala parameter, ale aby vracala hodnotu 10, teda

int function() { return 10; }

avšak v takomto prípade mi kompilátor vyhodí chybu kedy inicializujem pole

IntFunctionWithOneParameter functions[] =
        {
                function, - chyba
                ~~~~~~
                functionTimesTwo,
                functionDivideByTwo
        };

chybové hlásenie kompilátoru: a value of type "int(*)()" cannot be used to inicialize an entity of type "IntFunctionWit­hOneParameter". Chápem tomuto chybovému hláseniu, avšak nechápem to prečo sa toto chybové hlásenie zobrazí len keď vraciam funkcii číslo, a nezobrazí sa keď vraciam funkcii parameter. Však parameter je taktiež inicializovaný ako int a je mu priradená hodnota 8. Bol by som rád keby mi niekto vysvetlil prečo to tak je.

Za odpoveď veľmi pekne ďakujem :)

Zkusil jsem:

 
Odpovědět 29. července 18:11
Avatar
Nikolai
Člen
Avatar
Odpovídá na Nikolai
Nikolai:29. července 18:30

Chcem sa opraviť ku poslednému bodu kedy spomínam to chybové hlásenie. Práve som si uvedomil že funkcie ktoré inicializujem do pola deklarovaného "dátovým typom" IntFunctionWit­hOneParameter, musia obsahovať minimálne jeden parameter toho istého dátového typu ako parameter funkcie IntFunctionWit­hOneParameter.

Avšak teraz mi nie je jasná iná vec. Prečo musí byť funkcia v poli s rovnakým počtom parametrov a s tým istým dátovým typom ako pri funkcii IntFunctionWit­hOneParameter ?

 
Nahoru Odpovědět 29. července 18:30
Avatar
Nikolai
Člen
Avatar
Odpovídá na Nikolai
Nikolai:29. července 18:46

Tak nakoniec som si to do hlavy dokopal aj nejako sám. Lámal som si nad tým hlavu asi 5 hodín a nepochopil som tomu. Teraz sa mi nato stačilo pozrieť na 15 minút a pochopil som všetko čo som vedieť chcel.

Aj tak ďakujem. :D

Editováno 29. července 18:47
 
Nahoru Odpovědět 29. července 18:46
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 3 zpráv z 3.