int funktio1(int x){return x;} int funktio2(int x){return x+15;}
Kun ensimmäistä funktiota kutsuu, saa paluuarvona x.
funktio1=funktio2;
Jos ensimmäistä funktiota kutsuu nyt, saa paluuarvona x+15.
Esimerkiksi Lualla tämä on mahdollista. Entä c++:lla?
Jos käytät funktiota muuttujana, tee se näin:
int funktio(int i) { return i; } printf("%d",funktio(1));
Tuo tulostaa 1.
Funktiopointtereilla. About noin (testaamatonta):
int funktio1(int x){return x;} int funktio2(int x){return x+15;} int main(int argc, char* argv[]) { int (*fptr)(int x) = NULL; fptr = &funktio1; printf("%d\n", (*fptr)(10)); /* printtaa 10 */ fptr = &funktio2; printf("%d\n", (*fptr)(10)); /* printtaa 25 */ return 0; }
Ajattelin ratkaisun olevan paljon monimutkaisempi... Kiitos neuvoista!
Tuohon funktio-osoitukseenhan ei tarvita välttämättä &:ta mukaan. Ja annetaanpa nyt vielä yksi esimerkki määrittelyistä:
#include <stdio.h> int f1(int x) {return x+1;} int f2(int x) {return x+100;} typedef int funktio(int x); funktio *f = f1, *g = f2; // --- printf("%d != %d\n", f(0), g(0)); f = g; printf("%d == %d\n", f(0), g(0));
Tulipa mieleen uusi kysymys: saako funktioita vektoriin?
C++:aa pyydetty ja kaikki suoltaa C:tä :(
Jatkona aiempaan koodiin:
#include <vector> // --- std::vector<funktio*> funktiot; std::vector<funktio*>::iterator f_i; funktiot.push_back(f1); funktiot.push_back(f2); for (f_i = funktiot.begin(); f_i != funktiot.end(); ++f_i) { printf("%d\n", (*f_i)(10)); }
TsaTsaTsaa, väitätkö, ettei aiempi koodi toimi C++:na käännettynä? Vaatii tietenkin C:n stdio.h:n. Siistimpää olisi toki käyttää cstdio-otsikkoa ja std-nimiavaruutta.
En tokikaan väitä, mutta olisihan se ihan jees käyttää C++:ssa couttia printf:n sijasta. Vai onko printf:ssä jotain jippoja mihin coutilla ei pysty?
TsaTsaTsaa kirjoitti:
Vai onko printf:ssä jotain jippoja mihin coutilla ei pysty?
Minusta näistä ensimmäinen on selkeämpi:
printf("%+-15.4e %3.5f\n", a, b);
cout << setw(15) << setprecision(4) << scientific << showpos << left << a << " " << setw(3) << setprecision(5) << fixed << noshowpos << right << b << endl;
Kirjoitan ennemmin muutaman merkin mittaisen printf-formaatin kuin asetan coutille ne kaikki kummalliset parametrit. Ellen vallan erehdy, coutilta pitäisi ottaa nuo vielä pois seuraavan tulostuksen yhteydessä, jos haluaa oletusmuotoilun takaisin.
En tarkistanut jälkimmäisen täsmällistä oikeellisuutta.
TsaTsaTsaa kirjoitti:
Vai onko printf:ssä jotain jippoja mihin coutilla ei pysty?
printf tulee selkäytimestä, striimit ei.
Aihe on jo aika vanha, joten et voi enää vastata siihen.