Předmět Autor Datum
co??? Funcia sa vola: funkcia(parametre); Bolo by dobre precitat si najprv nejake zaklady C :)
MM.. 08.07.2010 18:03
MM..
Asi jsem to trošku blbě zformuloval. Dělám něco jako menu a nechci to dělat "natvrdo". Chci mít naps…
marekdrtic 08.07.2010 18:10
marekdrtic
Musis si tie polozky priradit na funkcie uz pri preklade. Pouzijes potom pointre na funkciu (ak to v…
MM.. 08.07.2010 18:20
MM..
da sa to aj bez typedef, tusim takto struct { char *nazov; void (*funkce)(void); }POLOZKA_STRUCT;…
MM.. 08.07.2010 18:40
MM..
Ak by nahodou PIC prekladac nevedel poiuntre na fcie, tak potom nejak napevno: menu[] = {"otvorit","…
MM.. 08.07.2010 18:29
MM..
OK, díky. Ten druhý způsob se mi zdá taky jednodušší. Snažím se šetřit místem, moc ho na to PICu nen…
marekdrtic 08.07.2010 18:38
marekdrtic
K tomu prekladacu je aj manual mikroc_manual.pdf mas tam aj kapitolu "Function pointers" P.S. ktory… poslední
MM.. 08.07.2010 18:42
MM..

Asi jsem to trošku blbě zformuloval. Dělám něco jako menu a nechci to dělat "natvrdo". Chci mít napsány všechny položky v menu v nějakém poli (nazvěme ho třeba array), které bude vypadat takhle:
{"menu1","menu2","menu3"}
To se vypíše na displej. Potom tam budou tlačítka a bude se měnit pozice kurzoru nad jednotlivými položkami. Aktuální pozice kurzoru bude uložena v proměnné "hover". A potom potřebuju funkci, která mi zavolá funkci s názvem array[hover]. V PHP by to mohlo vypadat třeba takhle:

//parametry, které se mění v závislosti na situaci
$i = "foo";
$a = "bar";
//Potřebuju zavolat funkci s názvem "funkce".$i.$a:
call_user_func("funkce".$i.$a,array(parametry...));

Musis si tie polozky priradit na funkcie uz pri preklade. Pouzijes potom pointre na funkciu (ak to vobec PIC prekladac podporuje, moze to byt ale dost narocne na prevedenie potom v tom PIC)
http://www.safercode.com/blog/2008/11/25/generic-f unction-pointers-in-c-and-void.html
Napr.

typedef void (*FUNC_PTR)(void);
struct
{
  char *nazov;
  FUNC_PTR funkce;
}POLOZKA_STRUCT;

POLOZKA_STRUCT polozky[] =
{
 {"menu1", funkce1},
 {"menu2", funkce2}
}

void ZmacknuteMenu(int index_menu)
{
 if(index_menu<(sizeof(polozky)/sizeof(POLOZKA_STRUCT))) //preistotu
  polozky[index_menu].funkce(), 
}

tak nejak (pisal som to teraz len tak zhlavy takze mozu tam byt syntakticke chyby apod, islo mi len o popis principu)

Ak by nahodou PIC prekladac nevedel poiuntre na fcie, tak potom nejak napevno:
menu[] = {"otvorit","zavret","konec"};
#define MENU1_FN Otvorit
#define MENU2_FN Zavret
#define MENU3_FN Konec

a potom:
if(idx==0) MENU1_FN();
else if(idx==1) MENU2_FN();
else MENU3_FN();

Tento sposob je jednoduchsi pre prekladac (ak by nezvladol tie pointre na funkcie).

Zpět do poradny Odpovědět na původní otázku Nahoru