Witam
Właściwie wszystko co istotne powiedział w poprzednim poście Mirek. Może jednak ja spróbuję wytłumaczyć Ci to jak początkujący początkującemu (lub jak wolisz hobbysta hobbyście).
Mianowicie - tak jak ja to rozumiem - mechanizm EVENT został stworzony po to aby ograniczyć się tylko do jednego miejsca w programie w którym wywoływana jest reakcja na dane zdarzenie. Tak więc musisz najpierw określić takie zjawisko które w sposób jednoznaczny potwierdzi ,że zaszło działanie które Cię interesuje. Musi to być coś jednoznacznego i unikalnego. Tak jak poradził Mirek można zrobić to w osłudze przerwania, co np. 10ms.
Wprowadzasz dodatkową zmienną, np. key_flag i w obsłudze przerwania sprawdzasz czy którykolwiek z klawiszy nie został naciśnięty. Jeśli tak , to stan key_flag zmienia się na 1. Wyjście z przerwania zwraca stan flagi oraz numer naciśniętego klawisza.
Stan flagi, key_flag jest warunkiem uruchomienia funkcji KEY_EVENT(). Jeśli flaga nie jest ustawiona KEY_EVENT nic nie robi, nie zajmując czasu w pętli głównej, jeśli jest ustawiona wdraża akcję wywołując Twoją funkcję obsługi.
Oczywiście można w prosty sposób wywołać funkcję obsługi, wpisując jej nazwę lub wskażnik do niej. Aby jednak uzyskać dodatkowe funkjonalności wprowadzono bardzo sprytny mechanizm callback.
W zasadzie sprowadza sie on do tego że funkcję, która ma wykonać działanie wywołujemy z pomocą wskaźnika który w momencie definicji nie jest określony (jest wskaźnikiem pustym) . Dopiero w trakcie działania programu, a dokładnie najczęściej w trakcie inicjacji ten pusty wskaźnik "kierujemy" na jakąś wybraną przez nas funkcję. Ten mechanizm kierowania (czy też może błędnie ale bardziej obrazowo) przypisania konkretnej funkcji do wywołującego , pustego początkowo wskaźnika nazywamy rejestracją i wykonujemy za pomocą wywołania specjalnej funkcji register. Taką rejestrację możemy wykonywać dowolnie w trakcie działania programu zmieniając w dowolny sposób funkcje które będą wywoływane w wyniku zdarzenia EVENT().
Funkcja register działa tak,że przypisuje ten pusty wskaźnik do wskaźnika funkcji którą chcemy wywołać . W ten sposób ten pusty dotychczas wskaźnik zaczyna wskazywać od tego momentu (wywołnia funkcji register) na okresloną przez nas własną funkcję.
Reasumując:
Tworzymy jakiś pusty wskaźnik na funkcję mającą argumenty w postaci (argumenty)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tworzymy funkcję rejestrującą
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
nazewnictwo jest zupełnie dowolne, ale przyjęta przez Mirka konwencja wykorzystywania nazw związanych z działąniem wydaje się być doskonała
Tworzysz funkcję EVENT()
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I to wszystko. Musisz tylko pamiętać aby przed uruchomieniem pętli głównej przypisac wskaźnik key_action_wsk do jakiejś swojej funkcji obsługi przez wywołanie funkcji register
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jeśli tego nie zrobisz , pierwsza część warunku w funkcji EVENT będie niespełniona i nie zostanie wywołane żadne działanie.
Mnie osobiście największą trudność sprawiła składnia:
1. w definicji pustego wskaźnika key_action_wsk i w funkcji register trzeba jak argumenty wpisać takie same argumenty, jakie będą występowac w Twojej własnej funkcji bsługi
2. Funkcję register wywołujesz wpisując jak argument tylko nazwę Twojej własnej funkcji, bez żdnych argumentów dodatkowych.
To tyle . Przepraszam, że tyle nudziłem na tematy oczywiste, ale mnie to sprawiało w pewnym momencie spore trudności
Oczywiście to wszystko jest dokładnie i szcegółowo opisane w książkach Mirka, ale niestety w różnych miejscach. Gdy człowiek jeszcze niedokładnie wie czego i gdzie szukać to jest to nieco kłopotliwe.
Pozdrawiam
W