Wskaźniki funkcji

0

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

#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

#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

#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ą:

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

Pozdrawiam

3

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

0

Czyli rejestrując moją funkcje moje_miganie_led

 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ą?

1

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

0

Zastanawia mnie jeszcze ten if:

 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 ;)

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.

1

To jest to samo co

if(fun_wsk != NULL) fun_wsk();
0

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

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.

0

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

*p  = 0;

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

++p;

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1