C ertokhoz kerdes
Palasik Sandor
palasik at mail.datanet.hu
Thu Oct 21 11:52:02 CEST 2004
> pl. egy tablazat ami csak a tobbi tablazat kezdopontjat tartalmazza,
> termeszetesen ezek mind konstansok, raadasol futasi idoben ROM-ban
> helyezkednek el.
Nem álltatom magam azzal, hogy értem a kérdést :-) Mindenesetre a példám
tökéletesen működik akkor, ha maguk a függvények címei vannak a táblázatban.
Az nem működik csak, hogy két függvény címének különbségét fordítási időben
kiszámolni.
void FUNC(void)
{
}
int x[] = {
(int)FUNC,
((int)FUNC)+5,
/* 5-(int)FUNC, */
};
Az előző kis példából csak az utolsó nem fordul le, amikor egy összegben
NEGATÍV előjellel szerepel egy függvény címe.
A következő példa pedig lefordul, de nem működik. A tömb tartalma csupa
nulla lesz.
Ha unsigned char helyett int van, akkor működik is. Láthatóan a linker nem
tudja elképzelni, hogy egy függvénypointerből nem tárolja az összes bitet.
unsigned char delta_items[4] =
{ (unsigned char)ITEM0,
(unsigned char)ITEM1,
(unsigned char)ITEM2,
(unsigned char)ITEM3,
};
int main()
{
int i;
for (i=0; i<4; i++) {
printf("%d: ",delta_items[i]);
((void
(*)(void))((int)ITEM0+(delta_items[i]-delta_items[0])))();
}
return 0;
}
Palasik Sándor
More information about the Elektro
mailing list