这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请问这是一个什么样的结构体?

共18条 1/2 1 2 跳转至

请问这是一个什么样的结构体?

高工
2013-09-18 19:26:48     打赏

下面结构体来自于Atmel的示例工程。

结构体里边的内容不太好理解啊。应该是一些函数头,但为什么能这么用啊?

像uint32_t (*Reset)( void ) ;,就是定义了一个函数Reset,参数为void

我不理解为什么能这么用。

typedef struct _SDISPBackend

{
    sDISPBackendData sData ;

    uint32_t (*Reset)( void ) ;
    uint32_t (*Initialize)( void ) ;
    uint32_t (*GetPixel)( uint32_t dwX, uint32_t dwY, SGUIColor* pclrResult ) ;
    uint32_t (*DrawPixel)( uint32_t dwX, uint32_t dwY, SGUIColor* pclrIn ) ;
    uint32_t (*DrawLine)( uint32_t dwX1, uint32_t dwY1, uint32_t dwX2, uint32_t dwY2, SGUIColor* pclrIn ) ;
    uint32_t (*DrawCircle)( uint32_t dwX, uint32_t dwY, uint32_t dwRadius, SGUIColor* pclrBorder ) ;
    uint32_t (*DrawFilledCircle)( uint32_t dwX, uint32_t dwY, uint32_t dwRadius, SGUIColor* pclrBorder, SGUIColor* pclrInside ) ;
    uint32_t (*DrawRectangle)( uint32_t dwX1, uint32_t dwY1, uint32_t dwX2, uint32_t dwY2, SGUIColor* pclrFrame ) ;
    uint32_t (*DrawFilledRectangle)( uint32_t dwX1, uint32_t dwY1, uint32_t dwX2, uint32_t dwY2, SGUIColor* pclrFrame, SGUIColor* pclrInside ) ;
    uint32_t (*DrawBitmap)( uint32_t dwX, uint32_t dwY, uint32_t dwWidth, uint32_t dwHeight, uint8_t* pucData ) ;
    uint32_t (*DrawText)( uint32_t dwX, uint32_t dwY, uint8_t* pszText, SGUIColor* pclrText, SGUIFont* pFont, uint32_t dwSize ) ;
    uint32_t (*Fill)( uint32_t dwX, uint32_t dwY, SGUIColor* pclrIn ) ;
    uint32_t (*IOCtl)( uint32_t dwCommand, uint32_t* pdwValue, uint32_t* pdwValueLength ) ;
} SDISPBackend ;



关键词: 请问     这是     一个     什么样     结构     uint32     SG    

高工
2013-09-18 19:29:24     打赏
2楼

使用的时候是这样的:

首先定义:static __no_init SDISPBackend* _aDISP_Backends[DISP_BACKEND_MAX] ;

然后_aDISP_Backends[DISP_BACKEND_ILI9325]=&sDISP_Backend_ILI9325 ;

sDISP_Backend_ILI9325的定义是这个:

SDISPBackend sDISP_Backend_ILI9325=
{
    .sData=
    {
        .dwID=DISP_BACKEND_ILI9325,
    },

    .Reset=_DBE_ILI9325_Reset,
    .Initialize=_DBE_ILI9325_Initialize,
    .GetPixel=_DBE_ILI9325_GetPixel,
    .DrawPixel=_DBE_ILI9325_DrawPixel,
    .DrawLine=_DBE_ILI9325_DrawLine,
    .DrawCircle=_DBE_ILI9325_DrawCircle,
    .DrawFilledCircle=_DBE_ILI9325_DrawFilledCircle,
    .DrawRectangle=_DBE_ILI9325_DrawRectangle,
    .DrawFilledRectangle=_DBE_ILI9325_DrawFilledRectangle,
    .DrawBitmap=_DBE_ILI9325_DrawBitmap,
    .DrawText=_DBE_ILI9325_DrawText,
    .Fill=NULL,
    .IOCtl=_DBE_ILI9325_IOCtl
} ;


院士
2013-09-18 19:56:31     打赏
3楼

函数指针,这样可以更换函数而无需再修改结构与变量。

即同样功能的画线函数,其实现方法不同,但只要将实现函数的指针地址赋过来就可以了。移植时相当方便了。


高工
2013-09-18 20:29:29     打赏
4楼
好复杂的函数指针啊,一般采用APP函数来实现对其封装,不过人家用的就是科学,领教了

高工
2013-09-18 20:32:18     打赏
5楼
我也领教了,用的时候应该很方便。就是刚看到这个时候很难理解啊。

高工
2013-09-18 20:33:32     打赏
6楼
函数指针还能这么用?没见过啊! 吾生亦有涯,学而无涯啊!

高工
2013-09-18 20:42:00     打赏
7楼
前几天看C语言教材后边有介绍,只有大师才能做到如此的高级应用啊

院士
2013-09-18 20:43:37     打赏
8楼
LZ,你可是很久没有露面了啊

高工
2013-09-18 20:59:47     打赏
9楼
一直在。没动手写东西,不好意思冒泡了。。。。。

高工
2013-09-18 21:01:56     打赏
10楼
至少我的c用的就很弱智。

共18条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]