2012-10-26 2 views
0

좀 더 설명해 드리겠습니다. 내가 구조 AB 유형 struct1 유형의 struct2struct2struct2의 정의라는 CD라는 다른 구조에 대한 포인터가 struct1 형식에 대한 포인터가 Func(param) 등의 기능을위한 몇 가지 프로토 타입을 가지고 있습니다. 누군가 제가 조금 이해하도록 도울 수 있다면, 나는 매우 감사 할 것입니다.C에서 이것이 무엇을 의미합니까? AB-> CD-> Func (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)의 정의를 찾을 수 없습니다. 무엇을하는지 찾을 수 없습니다.

+0

이 도움말을 수행

여기이 (also on ideone)이 어떻게 작동하는지 설명하는 간단한 예입니다? http://stackoverflow.com/questions/2575048/arrow-operator-usage-in-c – chris

+4

질문이있는 코드를 표시하고 산문에서 설명하지 마십시오. –

+0

이 질문은 너무 지역화 된 것처럼 닫히지 않아야한다고 생각하지 않습니다. 특히 struct에 내장 된 함수 포인터를 통해 함수를 호출하는 구문이 혼란 스럽습니다. 특히 C++에 익숙하다면 더욱 그러합니다. – dasblinkenlight

답변

3

"Func(param)을 포함한 기능에 대한 일부 프로토 타입"은 function pointer입니다. 마치 포인터가 해당 함수 이름을 나타내는 것처럼 포인터가 가리키는 함수를 호출 할 수 있습니다. 가장 안쪽의 구조체는 어떤 함수를 가리키는 포인터로 설정되어있다; 코드 스 니펫은 포인터를 통해 해당 함수를 호출합니다.

#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; 
} 
+2

이 답변을 downvoting하는 이유? –

1

이 매개 변수를 사용하여 struct2 구조의 함수 Func()을 호출합니다.

함수 Func()은 함수를 구성하는 명령어가 시작되는 포인터 (메모리 주소) 인 함수에 대한 포인터입니다.

설명은 How do function pointers in C work?을 참조하십시오.

변수 인 포인터는 호출에 사용되기 전에 설정되어야합니다.

+1

"회원 기능"? 이것은 'C'라는 태그가 붙어 있습니다. –

+0

알아. 그것은 "멤버 변수"와 비슷하지만 C++에서 알 수 있듯이 멤버 함수는 아니지만 개념을 이해하기 쉽습니다. – Flavius

+0

@ H2CO3 C++에 대한 모든 다른 질문에는 'c'가 붙습니다. –

관련 문제