Stránka 1 z 1

Pomoc s pointry

Napsal: 23 led 2010, 17:51
od mlike
Ahoj. Chtěl bych požádat, jestli by se našel někdo, kdo by mi tak trošku polopaticky vysvětlil použití pointrů v menu. Jedná se mi o to, že mám 4 tlačítka a každé má udělat jiný úkol. A pomocí pointrů se ten úkol "třídí". Jen nevim přesně jak. Já vim, že to tu nedávno bylo, ale bylo to v Cčku a to mi bohužel nic neříká, takže jsem to z toho jaksi nepobral. Buď jestli by to šlo vysvětlit jednodušeji, nebo nejlépe přímo v (pic)basicu. Děkuju moc za pomoc. Mlike

Tak jsem se prokousal až k tomu jak dostat pointr na funkci, ale nevim jak tu funkci potom spustit. V tom cčku je to takto:
void ccp(unsigned int event)
{
if(event > EV_LIMIT) fatal(); // fatalni chyba
ccp_entry[ccp_status][event](); // skoc na entry
}

a právě tento příkaz si neumim převést do basicu

Napsal: 23 led 2010, 19:51
od piitr
Když to hodně zjednoduším, tak je to asi takto. Mám výraz.

Kód: Vybrat vše

ccp_entry
Hodnota tohodle výrazu je nějaké pole.

Kód: Vybrat vše

ccp_entry[ccp_status]
Aplikovali jsme na to pole operaci hranatá závorka, čímž jsme z něj vzali jeden prvek. Ten prvek je ale sám o sobě další pole. (Bylo to pole v poli).

Kód: Vybrat vše

ccp_entry[ccp_status][event]
Aplikovali jsme další hranatou závorku, takže jsme z toho vnitřního pole vzali jednu hodnotu. Ta hodnota je zase nějakého typu. V tomto případě zřejmě typu ukazatel na funkci.

Kód: Vybrat vše

ccp_entry[ccp_status][event]()
Na ten ukazatel na funkci jsme aplikovali operaci kulatá závorka, čímž jsme funkci zavolali. Hodnota výrazu je návratová hodnota.

Kód: Vybrat vše

ccp_entry[ccp_status][event]();
Přidali jsme středník. Tím jsme z toho výrazu udělali příkaz. Návratovou hodnotu funkce zahazujeme.

Jak to přepsat do basicu, ti asi nepovím. V těchhle věcech je každý basic jiný a já zrovna picbasic neznám. Klidně je možné, že to v něm ani nepůjde - že nebude ukazatele na funkce vůbec znát. Pak by se to muselo psát celé trochu jinak.

Napsal: 23 led 2010, 22:48
od mlike
jj děkuju, pravděpodobně jsem i našel už příkaz jak na to. Děkuju za pomoc :)