0

もう少し説明させてください。構造内に構造AB型へのポインタがあり、typeとstruct1呼ばれる別の構造へのポインタがあり、の定義には、を含む関数のプロトタイプがいくつかあります。誰かが私を少し理解するのを手伝ってくれるなら、私はとても感謝しています。CDstruct2struct2Func(param)


はい、コードはマイクロコントローラーのUSBホスト用です。質問を追い払う可能性があるため、コードを追加しませんでしたが、ここにあります。

呼び出しは次のとおりです。

void USBHOST_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost){
    ...
    if (phost->usr_cb->UserInput() == USBH_USR_RESP_OK){
    ...
    }
    ...
}


typedef struct _Host_TypeDef
{
  HOST_State            gState;       /*  Host State Machine Value */
  HOST_State            gStateBkp;    /* backup of previous State machine value */
  ENUM_State            EnumState;    /* Enumeration state Machine */
  CMD_State             RequestState;       
  USBH_Ctrl_TypeDef     Control;

  USBH_Device_TypeDef   device_prop; 

  USBH_Class_cb_TypeDef               *class_cb;  
  USBH_Usr_cb_TypeDef                 *usr_cb;


} USBH_HOST, *pUSBH_HOST;


typedef struct _USBH_USR_PROP
{
  void (*Init)(void);       /* HostLibInitialized */
  void (*DeInit)(void);       /* HostLibInitialized */  
  void (*DeviceAttached)(void);           /* DeviceAttached */
  void (*ResetDevice)(void);
  void (*DeviceDisconnected)(void); 
  void (*OverCurrentDetected)(void);  
  void (*DeviceSpeedDetected)(uint8_t DeviceSpeed);          /* DeviceSpeed */
  void (*DeviceDescAvailable)(void *);    /* DeviceDescriptor is available */
  void (*DeviceAddressAssigned)(void);  /* Address is assigned to USB Device */
  void (*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef *,
                                     USBH_InterfaceDesc_TypeDef *,
                                     USBH_EpDesc_TypeDef *); 
  /* Configuration Descriptor available */
  void (*ManufacturerString)(void *);     /* ManufacturerString*/
  void (*ProductString)(void *);          /* ProductString*/
  void (*SerialNumString)(void *);        /* SerialNubString*/
  void (*EnumerationDone)(void);           /* Enumeration finished */
  USBH_USR_Status (*UserInput)(void);
  int  (*UserApplication) (void);
  void (*DeviceNotSupported)(void); /* Device is not supported*/
  void (*UnrecoveredError)(void);

}
USBH_Usr_cb_TypeDef;

これで、それが何をするのか理解できましたが、UserInput(void)の定義が見つかりません。それが何をするのかがわかりません。

4

2 に答える 2

3

「を含む関数のいくつかのプロトタイプ」と呼ぶものFunc(param)は、関数ポインタです。ポインタがその関数の名前を表しているかのように、ポインタが指す関数を呼び出すことができます。最も内側の構造は、いくつかの関数へのポインターで設定されています。コードスニペットは、ポインターを介してその関数を呼び出します。

これがどのように機能するかを示す短い例を次に示します(ideoneでも)。

#include <stdio.h>

typedef struct {
    void (*func)(int);  
} with_fp;

void test(int n) {
    printf("Test %d\n", n);
}

int main(void) {
    with_fp s = {.func = test};
    with_fp *ptr = &s;
    ptr->func(123);
    return 0;
}
于 2012-10-26T21:37:23.297 に答える
1

Func()これらのパラメータを使用して構造体の関数を呼び出しstruct2ます。

関数Func()は、関数へのポインタ、関数を構成する命令が始まるポインタ(メモリアドレス)です。

Cの関数ポインタはどのように機能しますか?を参照してください。説明のために。

変数であるポインタは、呼び出しに使用する前に設定する必要があります。

于 2012-10-26T21:31:58.697 に答える