Přetypování ukazatele na ukazatel na funkci

Zdravíčko.

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í
}

Mou otázkou je , jak správně přetypovat řádek označený “! ! ! ! ! ! ??? ! ! ! ! !” ?

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.

Předem díky za odpověď.

Mimo jiné:

KNIZNICE Knihy] = {{0x1000, (unsigned char *) &Jmeno_knihy}, //Ukazatel na proměnou {0x2000, (unsigned char *) &Vyber_knihu}}; //Ukazatel na funkci

To nejde.
Nemůžeš dát ukazatel na funkci do místa kam podle definice typu patří ukazatel na unsigned char. Ostatně to ani ukazatel na funkci není.

Stringy zásadně deklaruj jako typ char, ne unsigned char.

Móc hezké :slight_smile:.

[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.

A cenou nemyslím jen peníze…