Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Funktion käyttäminen muuttujan tavoin

Sivun loppuun

KoodiNoppa [23.11.2007 15:39:02]

#

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?

Kray [23.11.2007 15:47:54]

#

Jos käytät funktiota muuttujana, tee se näin:

int funktio(int i)
{
    return i;
}
printf("%d",funktio(1));

Tuo tulostaa 1.

Blaze [23.11.2007 15:48:25]

#

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;
}

KoodiNoppa [23.11.2007 16:43:36]

#

Ajattelin ratkaisun olevan paljon monimutkaisempi... Kiitos neuvoista!

Metabolix [23.11.2007 17:10:56]

#

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));

KoodiNoppa [23.11.2007 17:14:07]

#

Tulipa mieleen uusi kysymys: saako funktioita vektoriin?

TsaTsaTsaa [23.11.2007 17:15:05]

#

C++:aa pyydetty ja kaikki suoltaa C:tä :(

Metabolix [23.11.2007 17:36:26]

#

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.

TsaTsaTsaa [23.11.2007 17:56:26]

#

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?

Metabolix [23.11.2007 18:39:11]

#

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.

Blaze [23.11.2007 18:46:54]

#

TsaTsaTsaa kirjoitti:

Vai onko printf:ssä jotain jippoja mihin coutilla ei pysty?

printf tulee selkäytimestä, striimit ei.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta