PDA

View Full Version : حرفه ای: مشکل در بررسی یک کد خاص



moh555
یک شنبه 25 فروردین 1392, 23:13 عصر
سلام
من موقع بررسی یکی از سورس کد های شرکت اتمل به مشکلی برخوردم که فکر کنم برای شما هم جالب باشه.
تابع زیر را در نظر بگیرید:

inline void USB_Init(const S_usb *pUsb)
{
pUsb->pDriver->pMethods->init(pUsb);
}


داخل برنامه ،init به این صورت اعلان شده:



S_usb_init init;



و S_usb_init به این صورت تعریف(!) شده:



typedef void (*S_usb_init)(const S_usb *);


توجه کنید این تعریف آخری هیچ بدنه ای ندارد.
مشکل من اینست که اینجا تابع init به لحاظ منطقی چه کاری انجام می دهد؟من خودم اول فکر کردم حتما کد خنثی هست و برای توسعه های بعدی به صورت ناقص نوشته شده اما با غیر فعال کردن آن دیدم برنامه جواب نداد. تعاریف ساختارهای pMethod, pDriver , S_usbرا هم براتون می گذارم.


typedef struct {

S_usb_init init;
S_usb_write write;
S_usb_read read;
S_usb_stall stall;
S_usb_halt halt;
S_usb_remote_wakeup remoteWakeUp;
S_usb_cfg_endpoint configureEndpoint;
S_usb_attach attach;
S_usb_set_address setAddress;
S_usb_set_cfg setConfiguration;
S_usb_handler handler;
S_usb_connect connect;
S_usb_disconnect disconnect;

} S_driver_methods;

typedef struct {

void * pInterface;

void * pEndpointFIFO;


void * pDMAInterface;


unsigned int dID;

unsigned int dPMC;

const S_driver_methods* pMethods;

} S_usb_driver;


typedef struct _S_usb {

const S_usb_driver *pDriver; //!< Pointer to the low-level driver
S_usb_endpoint* const pEndpoints; //!< Endpoints list
unsigned int dNumEndpoints; //!< Number of endpoints in list
const S_usb_callbacks *pCallbacks; //!< Pointer to the callbacks
S_usb_request* const pSetup; //!< \brief Pointer to the last
//!< received SETUP packet
volatile unsigned int* const pState; //!< Current state of the device
} S_usb1;

typedef struct _S_usb S_usb;

rezaricky
سه شنبه 27 فروردین 1392, 13:01 عصر
در واقع S_usb_init یک Function Pointer هست.
typedef void (*S_usb_init)(const S_usb *);
در این خط از برنامه یک نوع جدید Function pointer تعریف شده است.
S_usb_init init;
و در این خط یک نمونه از ان ایجاد شده است.
اگه یک جستجویی در باره Function Pointer بکنید متوجه میشید.
http://en.wikipedia.org/wiki/Function_pointer
http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work

moh555
جمعه 30 فروردین 1392, 02:22 صبح
ممنون
مشکل من این بود که نمی تونستم محل ارچاع این پوینتر را پیدا کنم.که با تلاش خودم مشکل حل شد:لبخند: