Tak na szybko to bym wymyślił takie coś:
int address_range(intptr_t address) {
return 1*(0x0000 <= address && address < 0x2000)
+ 2*(0x2000 <= address && address < 0x20ff)
+ 3*(0x8000 <= address && address < 0xffff);
}
void (*function[4])(void *) = { ... };
void dispatch(intptr_t address, void *data) {
function[address_range(address)](data);
}
(chyba że zakresy byłyby równe - wtedy bym użył operatora dzielenia)