tmf napisał: MinisterQ - cos sciemniasz z tymi parametrami do funkcji przekazywanej jako wskaznik. W czym konkretnie miales problem? Podobnie ilosc rejestrow - piszac w C masz pewien poziom abstrakcji od sprzetu, zabawa z rejestrami moze posluzyc do napisania optymalniejszego kodu, ale nigdy nie jest to problemem. Kompilator powinien sie wszystkim zajac sam.
W sumie masz rację...
Moja wypowiedź była skutkiem tego, iż przez dłuższy okres czasu, kiedyś tam, programowałem pod AmigaOS i jego klonami, i tyko tam musiałem czasem pisać procedury które były zdefiniowane jako wskaźnik, i były wołane z parametrami (np. hooki). Na żadnej innej platformie której dotykałem nie musiałem tego robić...
A problem wynikał z tego, iż oryginalnie klasyczny AmigaOS powstał na procesory serii Motorola 680xx, i argumenty do funkcji (systemowych) przyjmował TYLKO poprzez rejestry procesora - D0-D7, oraz A0-A5 (A6 był wskaźnikiem na bazę biblioteki, a A7 to ramka stosu). Wraz z nadejściem następców systemu klasycznego kompilowanych na procesory PowerPC oraz x86, trzeba było to jakoś załatać... x86 ma relatywnie mniej rejestrów i funkcje przyjmują argumenty przez stos, a nie przez rejestry, na PowerPC część rejestrów idzie na emulację procesora m68k zaszytą w systemie, a reszty jest już za mało by zmapować wszystkie rejestry m68k dla "normalnego", nieemulowanego API. Suma summarum trzeba było stosować jakieś dzikie makra, które łatały kod tak, by mógł być rekompilowany na wszystkie platformy (klasyczną i następców) bez większych zmian, i z tego wynikały głównie problemy.
A żeby nie przynudzać, to napisałem na szybko programik który wywołuje procedurę zdefiniowaną jako wskaźnik z parametrami, i oczywiście działa bez problemu:
void send_msg(int a, int b) ;
void get_data(void(*wskaznik)(int a, int b))
{
wskaznik(1, 2);
}
void send_msg(int a, int b)
{
printf("a:%ld b:%ld", a, b);
}
int main(int argc,char *argv[]){
get_data(send_msg);
}
Niniejszym przepraszam za lekką dezinformację.
