Wskaźniki funkcji

Wskaźniki funkcji
HE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Witam.
Jestem nowy na forum i mam do was pytanie. Mam taki program:
main.c

Kopiuj
#include <avr/io.h>

#include "keys.h"

#define LED1 (1<<PD7)
#define LED1_TOG PORTD ^= LED1

void moje_miganie_led(void) {
        LED1_TOG;
}

int main(void) {

        DDRD |= LED1;

        key_init();

        while(1) {

                moj_klawisz( moje_miganie_led );  // TU ZASZŁA ZMIANA !!!

        }
}

keys.c

Kopiuj
#include <avr/io.h>

#include "keys.h"

// inicjalizacja biblioteki
void key_init(void) {
        PORTC |= KEY1;
}

// obsługa klawisza
void moj_klawisz( void (*fun_wsk)(void) ) {  // TU ZASZŁA ZMIANA !!!

        static uint16_t key_lock;

         if( !key_lock && !(PINC & KEY1 ) ) {
          key_lock=50000;

          // reakcja na PRESS (wcinięcie przycisku)
          //LED1_TOG;
          //PORTD ^= (1<<PD7);
          if( fun_wsk ) fun_wsk();  // TU ZASZŁA ZMIANA !!!

         } else if( key_lock && (PINC & KEY1 ) ) key_lock++;
}

keys.h

Kopiuj
#ifndef KEYS_H_
#define KEYS_H_

#define KEY1 (1<<PC7)

void key_init(void);

void moj_klawisz( void (*fun_wsk)(void) ); 
 

#endif /* KEYS_H_ */

Możecie koledzy wytłumaczyć mi o co chodzi z linjką:

Kopiuj
void moj_klawisz( void (*fun_wsk)(void) ); 

Pozdrawiam

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
3

Jest to dekleracja funkcji przyjmującej jako parametr wskaźnik na funkcję nie zwracającą nic i przyjmującej 0 parametrów.

HE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Czyli rejestrując moją funkcje moje_miganie_led

Kopiuj
 moj_klawisz( moje_miganie_led );

funkcja moje_miganie_led wykona się wtedy kiedy wykona się funkcja moj_klawisz i po wskaźniku wywoła moją?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

Przekazujesz do funkcji moj_klawisz wskaźnik na swoją funkcję. Wewnątrz niej wywołujesz go.

HE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Zastanawia mnie jeszcze ten if:

Kopiuj
 if( fun_wsk ) fun_wsk();

wykona się tylko wtedy kiedy moja funkcja jest prawdziwa czyli zawsze jak ją zarejestruję? Nie zarejestrowana funkcja równa się nie spełnieniem warunku?
Dziękuję bardzo za pomoc w zrozumieniu zagadnienia ;)

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

To jest sprawdzenie, czy nie został podany NULL jako wskaźnik. Jeśli tak to oczywiście żadnej funkcji do wywołania nie ma.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

To jest to samo co

Kopiuj
if(fun_wsk != NULL) fun_wsk();
HE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Już wiem dużo więcej ale jeszcze mam pytania takiego fragmentu kodu:

Kopiuj
char * strtok_mk(char * str, char const * delims) {
  static char  * src = NULL;
  char  *  p,  * ret = 0;

  if (str != NULL) src = str;
  if (src == NULL) return NULL;
  if ((p = strpbrk (src, delims)) != NULL) {
    *p  = 0;
    ret = src;
    src = ++p;
  } else if (*src) {
    ret = src;
    src = NULL;
  }
  return ret;
}

Chodzi mi o zmienną p, nie do końca rozumiem wskaźnik na char a później zerowanie go i dodawanie.
Jeszcze mam pytanie czy moją koledzy jakiś fajny opis jak działać na wskaźnikach bo nie do końca je rozumiem.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

To jest arytmetyka na wskaźniku: http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node25.html

Kopiuj
*p  = 0;

tutaj nie zerujesz wskaźnika, tylko obiekt (w tym przypadku znak), na który wskazuje ten wskaźnik.

Kopiuj
++p;

to jest to samo co p = p + 1, czyli przesuwanie wskaźnika na następny element, więcej w podlinkowanym artykule.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.