pointer na pole funkcii

Programovacie jazyky, rady, poradňa...
gregor123456
Amateur
Amateur
Príspevky: 11
Registrovaný: 14 mar 2013, 20:57

pointer na pole funkcii

Príspevok od používateľa gregor123456 »

Potreboval by som zistit ako zavolam funkciu pomocou nejakeho slova ktore napisem do vstupu ak tato funkcia ma aj vracat typ double. Funguje mi to iba pre funkciu bez navratovej hodnoty a to v tomto pripade

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void vypis(){
     printf("Funkcia na vypis\n");
     }
void odmena(){
     printf("Funkcia na odmenu\n");
     }
void mzdy(){
     printf("Funkcia na mzdu\n");
     }
void sucet(){
     printf("Funkcia nasucet\n");
     }
void histogram(){
    //tu bude zmena 
     printf("Funkcia na histogram\n");
    /tu bude zmena 
     }
int main()
{
    typedef void (* P_FNC)(); 
    P_FNC  funkcia[5] = {vypis, odmena, mzdy, sucet, histogram} ;  
    char s[31],a[]="vypis",b[]="odmena",c[]="mzdy",d[]="sucet",e[]="histogram",k[]="koniec";

     while(1){
         gets(s);   
      if (strcmp (a,s) == 0)
      funkcia[0]();
      if (strcmp (b,s) == 0)
      funkcia[1]();
      if (strcmp (c,s) == 0)
      funkcia[2]();
      if (strcmp (d,s) == 0)
      funkcia[3]();
      if (strcmp (e,s) == 0)
      funkcia[4](); 
       if (strcmp (k,s) == 0)
      break; 	
}
  return 0;
}
teraz urobim zmenu vo funkcii:

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void vypis(){
     printf("Funkcia na vypis\n");
     }
void odmena(){
     printf("Funkcia na odmenu\n");
     }
void mzdy(){
     printf("Funkcia na mzdu\n");
     }
void sucet(){
     printf("Funkcia nasucet\n");
     }
double histogram(){
     int d=2;
     printf("Funkcia na histogram\n");
     return d;
     }
int main()
{
    typedef void (* P_FNC)();
    P_FNC  funkcia[5] = {vypis, odmena, mzdy, sucet, histogram} ;
    char s[31],a[]="vypis",b[]="odmena",c[]="mzdy",d[]="sucet",e[]="histogram",k[]="koniec";

     while(1){
         gets(s);   
      if (strcmp (a,s) == 0)
      funkcia[0]();
      if (strcmp (b,s) == 0)
      funkcia[1]();
      if (strcmp (c,s) == 0)
      funkcia[2]();
      if (strcmp (d,s) == 0)
      funkcia[3]();
      if (strcmp (e,s) == 0)
      funkcia[4](); 
       if (strcmp (k,s) == 0)
      break; 	
}
  return 0;
} 


ale toto mi vypisuje chybu, tak neviem. Za kazdu radu vopred dakujem.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: pointer na pole funkcii

Príspevok od používateľa BX »

Tak za prvé - definovať typ vo funkcií nie je úplne pekná záležitosť.

Za druhé, ty si si definoval P_FNC ako pointer na funkciu, ktorá nemá parametre a vracia void. Ak by si chcel pointer na funkciu bez parametrov s návratovou hodnotu double, tak by to bolo double (* P_FNC_DOUBLE)();
To je ale úplne iný typ! Tak ako v poli nemôžeš miešať inty a doubly, tak tam nemôžeš miešať toto.

Dalo by sa to odžubkať nejakým hnusným pretypovaním, ale najprv sa radšej spýtam - naozaj chceš toto robiť? Zdá sa ti to ako dobré riešenie? Lebo mne nie.
gregor123456
Amateur
Amateur
Príspevky: 11
Registrovaný: 14 mar 2013, 20:57

Re: pointer na pole funkcii

Príspevok od používateľa gregor123456 »

Tak toto bolo len krajné riešenie , proste len po zadaní slova na vstupe bude volať funkciu s rovnakym nazvom. No niektore funkcie maju parametre alebo vracaju nejake pole ktore si v nej alokuju a tak... Tak neviem ako by to bolo vhodné spraviť, viem to robiť ako som už napísal a ukázal len pre funkcie void.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: pointer na pole funkcii

Príspevok od používateľa BX »

A napíš mi jeden dôvod, prečo by to nešlo takto:

Kód: Vybrať všetko

if (strcmp (a,s) == 0)
   vypis();

if (strcmp (b,s) == 0)
   odmena();

if (strcmp (k,s) == 0)
   break;  
gregor123456
Amateur
Amateur
Príspevky: 11
Registrovaný: 14 mar 2013, 20:57

Re: pointer na pole funkcii

Príspevok od používateľa gregor123456 »

No toto som potreboval , diky kámo.
Napísať odpoveď