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