Myślę, że na razie twój największy kłopot to jest ze zrozumieniem "
funkcji typu callback" zgadza się ? nie za bardzo wiesz o co w tym chodzi - zresztą widać to po tym kodzie, zatem spróbuję to na początek przybliżyć.
1. funkcje callback to funkcje zwrotne - co to oznacza? Ni mniej ni więcej tylko to, że jak piszesz komuś np jakiejś drugiej osobie jakąś funkcję do obsługi klawiatury - wszystko super. No ale ta osoba chciałaby mieć możliwość wykonywania własnej funkcji gdy zostanie naciśnięty jakikolwiek klawisz (bo np chce zliczać ilość naciśnięć klawiszy) ... to jak to zrobisz ???? A przecież nie możesz pozwolić na to żeby ta osoba grzebała w twojej bibliotece do obsługi klawiatury.
2. mówisz więc tej osobie, "słuchaj zrobię ci tą bibliotekę" ale żebyś mi nie mieszał w niej to umożliwię ci to żeby ta moja bibblioteka wywoływała jakąś jedną twoją funkcję, którą sam sobie napiszesz. Może to być dowolna funkcja i mnie nie obchodzi co w niej będzie
3. w związku z powyższym musisz tej osobie przekazać jeszcze jakąś możliwość dzięki, której ta twoja biblioteka dowie się w późniejszym czasie, gdy osobnik ten otrzyma bibliotekę, - możliwość ta to właśnie jakaś jedna dodatkowa funkcja, pozwalająca na zarejestrowanie na potrzeby tej biblioteki funkcji użytkownika
4. zatem po napisaniu swojej bibloteki przygotujemy funkcję typu
register_my_func( ); której argumentem będzie wskaźnik na przyszłą funkcję tej osoby, i podamy jej instrukcję jak ma tego używać.
5. napiszesz więc, do tej osoby maila i poinformujesz, że:
a.) zanim zaczniesz myśleć o korzystaniu z mojej biblioteki stwórz w kodzie swoją własną funkcję do zliczania kliknięć np
Kod:
void klik( void );
b.) gdy już ją będziesz miał to zanim użyjesz funkcji mojej biblioteki - jeszcze przed pętlą główną, zarejestruj tą swoją funkcję na potrzeby mojej biblioteki, masz w tym celu ode mnie dodatkową funkcję o nazwie
register_my_func( );, zrób to tak
Kod:
register_my_func( klik );
c.) dopiero po tej operacji możesz w pętli głównej korzystać z mojej biblioteki i mieć pewność, że gdy wykryje ona wciśnięcie jakiegokolwiek klawisza to wywoła twoją własną funckję, którą zarejestrowałeś jak wyżej
d.) co by się stało gdybyś zapomniał zarejestrować swojej funkcji i jej w ogóle nie stworzył a wywołał moją bibliotekę ? NIC BY SIĘ NIE STAŁO - ponieważ ja w kodzie bibliooteki sprawdzam to czy dokonałeś rejestracji - jeśli nie to nie zostanie wywołana żadna funkcja
więc śpij spokojnie - a oczywiście cała reszta biblioteki będzie działać nadal poprawnie. Sprawdzenie czy zarejestrowałeś swoją funkcję u mnie wygląda tak:
Kod:
if( user_callback ) user_callback; // jeśli wskaźnik do funkcji użytkownika nie jest pusty to wywołaj tę funkcję
---------------------------------
dobra koniec wyjaśnień - tymczasem ty w tym kodzie, który pokazałeś, no właśnie co? sprawdziłeś czy jest zarejestrowana jakaś funkcja i ją próbujesz wywołać
Kod:
if (keyb_event_callback) (*keyb_event_callback)();
ale gdzie masz tą własną funkcję i jej rejestrację ??? zostało tylko to:
Kod:
register_keyb_event_callback(...?...);
czyli napisz własną funkcję i ją właśnie zarejestruj w tym nawiasie w miejscu tego znaku zapytania