Mam PIC18F46K22 i programuję go za pomocą kompilatora XC8. Na koniec będę mieć system podobny do komputera z stdin
i stdout
. Tak więc w głównej pętli pojawi się funkcja sprawdzająca, czy jest nowe wejście. Jeśli jest wejście, funkcja zostanie odpowiednio wywołana. Na przykład, kiedy wprowadzę A stdin
, PIC uruchomi funkcję podobną function_A
do tej, function_B
która jest wywoływana, gdy wprowadzę B.
Kiedy PIC jest wykonywany z funkcją, chcę, aby nowe wejście zostało wysłane do funkcji. Tak więc po naciśnięciu A otwiera się nadajnik RS232, od tego momentu każde wejście będzie wysyłane przez RS232. Ostatecznie projekt jest samodzielnym edytorem tekstu. Kiedy więc naciśniesz A, otwiera system plików, od tej chwili nie edytujesz już tekstu, ale przeglądasz listę plików. Oznacza to, że naciśnięcie przycisku w górę lub w dół oznacza coś innego niż w środowisku do edycji tekstu.
Dużo zastanawiałem się, jak zaprogramować to w C. Myślałem o tym wczoraj i chciałbym wiedzieć, czy to możliwe, a jeśli tak, to w jaki sposób. Chcę zrobić:
main
Funkcja wywołuje funkcję jakfunction_A
function_A
zmienia zmienną globalnąfunction_addr
na wskaźnik adresu funkcjiin_function_A
- Od tego momentu
main
wywołuje funkcję wfunction_addr
momencie pojawienia się nowego wejścia.
Potrzebuję więc main
funkcji sprawdzającej, czy function_addr
wynosi zero. Jeśli tak, należy wywołać funkcję „normalną”, np function_A
. Jeśli nie jest, function_addr
należy wywołać funkcję at . Potrzebuję również, function_A
który zmienia function_addr
wskaźnik na in_function_A
.
Uwaga: kiedy funkcja systemu plików powinna być zamknięta, is_function_A
powinna zmienić się function_addr
na 0.
Więc w zasadzie moje pytanie brzmi: jak mogę
- Uzyskaj adres funkcji (i zapisz go w zmiennej)
- Wywołaj funkcję pod określonym adresem
Odpowiedzi:
Funkcja
Uzyskaj adres funkcji (i zapisz go w zmiennej)
Wywołaj funkcję pod określonym adresem
źródło
fp(12)
nie zwiększa czytelności(*fp)(12)
. Mają różną czytelność.(*fp)(12)
przypomina czytelnikowi, żefp
jest wskaźnikiem, a także przypomina deklaracjęfp
. Moim zdaniem ten styl jest powiązany ze starymi źródłami, takimi jak elementy wewnętrzne X11 i K&R C. Jednym z możliwych powodów, dla którego można go skojarzyć z K&R C, jest to, że w ANSI C można zadeklarowaćfp
użycie składni funkcji, jeślifp
jest parametrem:int func(int fp(double)) {}
. W K&R C byłoby to możliweint func(fp) int (*fp)(double); { ... }
.Chociaż odpowiedź Woutersa jest absolutnie poprawna, być może jest to bardziej przyjazny dla początkujących i lepszy przykład dotyczący twojego pytania.
Jeśli nie jest oczywiste, że wskaźnik funkcji faktycznie ma przypisany adres funkcji docelowej, dobrze jest sprawdzić wartość NULL.
źródło
fp
się zajmuje, początkowo jest równa NULL. Zrobiłbym toint (*fp)(int) = NULL;
jako połączoną deklarację i inicjalizację, aby być pewnym - nie chcesz przeskakiwać do jakiejś przypadkowej lokalizacji w pamięci z powodu jakiejś głupiej wartości, która właśnie się tam pojawiła. Następnie po prostu przypiszfp
jak w swojejExample()
funkcji.fp
jest to „zmienna globalna” (jak w powyższym kodzie), to gwarantuje się, że zostanie ona zainicjowanaNULL
(bez konieczności jawnego).