Confusing regarding function interpretation

寵の児 提交于 2019-12-13 02:04:19

问题


I'm trying to interface a 4x4 keypad with a TFT display. I want to implement a keypad event listener such that the appropriate screen will be loaded each time a key is pressed. The event listener will be keeping track of which screen is currently loaded, and will be listening for specific key inputs.

The keypad event listener is defined (and will be called in the setup() function in my main arduino sketch (I'm using Atmel Studio + Visual muicro arduino plug-in. The code is written in C++):

void Keypad_apiClass::createKeypadEventHandler(void)
{
    keypad44.addEventListener(screenState_keyHandler);
}

And the screenState_keyHandler is defined thus:

void screenState_keyHandler(KeypadEvent keyPressed)
{
   switch(Display_api.screenDisplayID)
   {
      case 0x0A:      //menu screen
      switch(keyPressed)
      {
     case '1':
     //go to sensor readings screen
     break;

     case '2':
     //go to  system settings screen
     break;

     case '#':
     //go to  systemReboot screen
     break;

     default:
     //do nothing
     break;
  }
  break;

  default:
  break;
  }
}

When I look at the prototype of the function addEventListener (in the header file where it is declared, I see this:

void addEventListener(void (*listener)(char));

I'm having trouble understanding the parameter of the prototype. Is it expecting a function pointer or what? Could someone please explain the parameter in the prototype above?

When I compile, I get

    Compiling 'adutoSecuritySystem' for 'Arduino Mega w/ ATmega2560 (Mega 2560)'
keypad_api.cpp:In member function 'void Keypad_apiClass::createKeypadEventHandler()'
keypad_api.cpp:112:50: error: no matching function for call to 'Keypad::addEventListener(<unresolved overloaded function type>)'
keypad_api.cpp:candidate is
Keypad.h:addEventListener(void (*)(char))
Keypad.h:no known conversion for argument 1 from '<unresolved overloaded function type>' to 'void (*)(char)'
Error compiling

That's why I'm confused! The only other place the function exists is in the member declaration of the class:

class Keypad_apiClass
{
 protected:


 public:
   void init();
   char retrieveKeyPressed(void);
   char waitAndRetrieveKeyPressed(void);
   uint8_t returnKeyPressed_IntVersion(char keyPressed);
   void createKeypadventHandler(void);
   void screenState_keyHandler(KeypadEvent keyPressed);
};

回答1:


Yes it is a function pointer

void           (*listener)       (char)
^return type     ^function name   ^argument type

So it is a function named listener that takes a char argument and has no return value.

Your screenState_keyHandler fits this signature.

void screenState_keyHandler(KeypadEvent keyPressed)

It has no return, and I'm assuming that KeypadEvent is a typedef'd char



来源:https://stackoverflow.com/questions/31318323/confusing-regarding-function-interpretation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!