2012-10-26 54 views
0

好的,讓我再解釋一下。我有一個指向結構AB類型struct1的指針結構裏面有一個指向CD類型struct2的另一個結構的指針,並且struct2的定義有一些函數原型,包括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(無效)的定義,我無法找到它做什麼。

+0

這是否幫助? http://stackoverflow.com/questions/2575048/arrow-operator-usage-in-c – chris

+4

顯示你有問題的代碼,不要試圖用散文來描述它。 –

+0

我不認爲這個問題應該被關閉爲過於局部化:通過嵌入在'struct'中的函數指針調用函數的語法真的很混亂,特別是如果你熟悉C++。 – dasblinkenlight

回答

3

你所說的「一些原型功能,包括Func(param)」什麼是function pointer。您可以調用指針所指向的函數,就好像指針表示該函數的名稱一樣。最內層的結構已經建立了一個指向某個函數的指針;你的代碼片段通過它的指針調用該函數。

下面是說明了這是如何工作(also on 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; 
} 
+2

任何理由低估這個答案? – 2012-10-26 21:41:02

1

它調用結構struct2與那些參數的函數Func()

功能Func()是指向一個函數,一個指針(存儲器地址),其中所述指令從而彌補了功能開始。

的解釋請參見How do function pointers in C work?

指針,作爲一個變量,必須給正在使用的呼叫之前設置。

+1

「會員功能」?這被標記爲'C'。 – 2012-10-26 21:34:32

+0

我知道。它類似於「成員變量」,雖然它不是一個成員函數,但它可以讓你更容易掌握這個概念。 – Flavius

+0

@ H2CO3有關C++的其他問題都標記爲'c'。 –