Funktion kutsuminen muuttujan avulla (c++)

Tarkoitus olisi, että pääohjelmassa pyörii vain yksi silmukka, jossa on laskuri (joka kierroksella arvo lisääntyy yhdellä). Silmukassa kutsutaan funktiota laskurin arvon avulla, eli funktioita on monta erilaista. Ajatus oli että funktiot olisi nimetty numeroin, näinhän homma toimisi yksinkertaisesti. Mutta toimiiko käytännössä?

Onko tuon tyyppistä juttua mahdollista toteuttaa c :ssa? Jotain konstia millä olisi helppo käydä läpi monia funktioita peräkanaa?
8815
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

Kuten tossa on jo vastattu, funktio-pointerilla tuon voi toteuttaa. Kuitenkin jos funktiot ovat erilaisia (kuten kirjoitit) esim. eivät ota samaa määrää parametreja, homma ei olekaan niin helppo.

Yleensä funktio-pointerit kannattaa suosiolla kiertää varsinkin kun C mahdollistaa olio-pohjaisen suunnittelun ja toteutuksen => tässä tapauksessa kannattaa varmaan miettiä miten ton vois toteuttaa ilman noita funktio-pointereita käyttämällä standardi C :n keinoja.

Katsoppas vaikka C FAQ: Functonoid.

Äänestä
  • polymorfisilla olioillahan on ylimääräisenä lastinaan vtable, joka sisältää funktiopointterit oikeisiin funktioihin jos teet:

    Puu *p = new Tammi;

    niin *p-oliossa on kai taulukko, jossa on pointterit kaikkiin virtuaalisiin funktioihin, jotta ohjelma osaa kutsua Tammen metodeita eikä Puun metodeita vaikka käytetään Puu-pointteria.

    Sanoin tämän vain siksi, että kävisi ilmi, että oliot ja perintä on tehty "sillä silmällä", että näin voisi korvata omien funktiopointterien käytön

    Äänestä

Pistä jonkinlainen esimerkki vaikka switch-case-tyyliin.

Äänestä
  • ... tulee siis olemaan (ainakin ajatukseni mukaan), yksinkertaisia, kysytään kysymys ja annetaan vastaus. Jokainen funktio on erilainen, mutta palauttaa samanlaisen arvon (eli kokonaisluvun). (en ole vielä ohjelmaa suuremmin kirjoittanut)

    Pointtereihin olen nyt tutustunut, mutta mikään esimerkki ei oikein kerro että miten tällainen juttu toteutetaan missä kutsutaan monta eri funktiota. Tai sitten en vaan tajua :P

    Äänestä

  • ... kirjoitti:

    ... tulee siis olemaan (ainakin ajatukseni mukaan), yksinkertaisia, kysytään kysymys ja annetaan vastaus. Jokainen funktio on erilainen, mutta palauttaa samanlaisen arvon (eli kokonaisluvun). (en ole vielä ohjelmaa suuremmin kirjoittanut)

    Pointtereihin olen nyt tutustunut, mutta mikään esimerkki ei oikein kerro että miten tällainen juttu toteutetaan missä kutsutaan monta eri funktiota. Tai sitten en vaan tajua :P

    Miten olet suunnitellut kutsujalohkossa antaa funktiolle parametrit?

    Äänestä

Esim. näin sen voisi toteuttaa:

void f1(int);
void f2(int);
void f3(int);

typedef void (*fp)(int);

fp functions[3] = {f1, f2, f3};

Sitten vain kutsutaan funktioita tyyliin

functions[0](5);

esim.

Äänestä

Kommentoi aloitusta


... kirjoitti:

Tarkoitus olisi, että pääohjelmassa pyörii vain yksi silmukka, jossa on laskuri (joka kierroksella arvo lisääntyy yhdellä). Silmukassa kutsutaan funktiota laskurin arvon avulla, eli funktioita on monta erilaista. Ajatus oli että funktiot olisi nimetty numeroin, näinhän homma toimisi yksinkertaisesti. Mutta toimiiko käytännössä?

Onko tuon tyyppistä juttua mahdollista toteuttaa c :ssa? Jotain konstia millä olisi helppo käydä läpi monia funktioita peräkanaa?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu