C ertokhoz kerdes

Palasik Sandor palasik at mail.datanet.hu
Wed Oct 20 12:17:17 CEST 2004


Szia!

Ez inkább linker problémának látszik. Mi tudjuk, hogy két függvénypointer
különbsége konstans, de a compiler nem. Illetve valószínűleg nem tud olyan
műveletet beírni az objectba, hogy két external különbségét számolja ki.

Csináltam egy példát. Az inicializálást kikommenteztem és beírtam hozzá azt
a hibajelzést, amit adott rá eredetileg. Kicsit perverz, és arra
támaszkodik, hogy a kódok rövidek, úgyhogy a pointerek különbsége elfér egy
bájtban, de lefordítva működik.

Palasik Sándor

#include <stdio.h>
#include <stdlib.h>

void ITEM0(void)
{
        printf("ITEM0\n");
}

void ITEM1(void)
{
        printf("ITEM1\n");
}

void ITEM2(void)
{
        printf("ITEM2\n");
}

void ITEM3(void)
{
        printf("ITEM3\n");
}


unsigned char delta_items[4]
/*
 =      { (unsigned char)ITEM1-(unsigned char)ITEM0,
          (unsigned char)ITEM1-(unsigned char)ITEM0,
          (unsigned char)ITEM2-(unsigned char)ITEM0,
          (unsigned char)ITEM3-(unsigned char)ITEM0}

FUNNY.C(26) : error C2099: initializer is not a constant
FUNNY.C(27) : error C2099: initializer is not a constant
FUNNY.C(28) : error C2099: initializer is not a constant
FUNNY.C(29) : error C2099: initializer is not a constant
*/
;

int main()
{
        int i;

        delta_items[0] = (unsigned char)ITEM0-(unsigned char)ITEM0;
        delta_items[1] = (unsigned char)ITEM1-(unsigned char)ITEM0;
        delta_items[2] = (unsigned char)ITEM2-(unsigned char)ITEM0;
        delta_items[3] = (unsigned char)ITEM3-(unsigned char)ITEM0;

        for (i=0; i<4; i++)
                ((void (*)(void))((int)ITEM0+delta_items[i]))();

        return 0;
}




More information about the Elektro mailing list