Mám dotaz na experty programátory v Céčku.
No, raději začnu od zdrojáku.
knihovna.h
typedef struct _KNIHOVNA //Zde definuji nový typ
{
unsigned int index; //Index v knihovne
unsigned char *pROM; // Ukazatel (právě s ním budou problémy)
}KNIZNICE;
unsigned char* Vyber_knihu(unsigned int param);
"knihovna.c"
unsigned char Jmeno_knihy] = "Neználek na měsíci";
KNIZNICE Knihy] =
{{0x1000, (unsigned char *) &Jmeno_knihy}, //Ukazatel na proměnou
{0x2000, (unsigned char *) &Vyber_knihu}}; //Ukazatel na funkci
unsigned char* Vyber_knihu(int param)
{
//nějaká rutina
}
void Cti_titulek (unsigned int posice)
{
unsigned char* (*PtoFunc)(unsigned int); //ukazatel na funkci; zatím nedefinovaný
PtoFunc = Knihy[posice].pROM; // ! ! ! ! ! ! ?????? ! ! ! ! !
//Další zpracování a volání funkcí
}
Další upřesnění:
1.) Všechny funkce přiřazené do Kniznice mají stejnou deklaraci (parametr je unsigned int a vrací ukazatel)
2.) Nejde mi o nějaké “obejít od lesa”.
Chci vědět, jak přetypovat nějakého ukazatele na ukazatel na funkci,
tak aby mi překladač nevyhazoval Warning.
3.) Samozřejmě vím, že daný problém lze provést jinak a bez komplikací.
Prostě a jednoduše mi toto řešení zabírá nejméně RAMky
v aplikaci, kde už počítám s každým bytem.
4.) Net jsem prolezl, ale odpověď se mi najít nepodařilo.
[code]typedef struct //Zde definuji nový typ
{
unsigned int index; //Index v knihovne
void *pROM; // Ukazatel (právě s ním budou problémy)
}KNIZNICE;
char* Vyber_knihu(unsigned int param)
{
printf(“funguje\r\n”);
return NULL;
}
int _tmain(int argc, _TCHAR* argv])
{
char Jmeno_knihy] = “Neználek na měsíci”;
KNIZNICE Knihy] =
{{0x1000, (void *)Jmeno_knihy}, //Ukazatel na proměnou
{0x2000, (void *)Vyber_knihu}}; //Ukazatel na funkci
unsigned char* (*PtoFunc)(unsigned int); //ukazatel na funkci; zatím nedefinovaný
PtoFunc = (unsigned char* (*)(unsigned int))(Knihy[1].pROM);
PtoFunc(17);
return 0;
}[/code]Parametr při volání tady nemá význam, to si už jistě pořešíš. Když chceš skladovat v jednom pointeru více jejich typů, deklaruj ho jako pointer na void a pak dle využití přetypuj. Nejsem si ovšem jist, jesli musejí být všechny pointery na konkrétním systému ve stejné bitové šířce. Aby se nestalo, že pointer někam je 16b a jinam 32b. To by mohl být problém.
Piityy: Moc děkuji.
Jelikož ten program půjde do procesoru ATmega32,
tak všechny pointery (na funkci i do SRAMky) mají shodnou velikost 16 bitů.
Je mi však jasné, že mi tento program v ATMega128 nepojede.
AB: Teď si do tebe trochu rýpnu, protože tuhle negativistickou filosofii
nemám rád a je mi tak trochu k smíchu.