搜索
bottom↓
回复: 10

这两个结构体的意思?

[复制链接]

出0入0汤圆

发表于 2014-9-17 10:46:20 | 显示全部楼层 |阅读模式
下面两个结构体是在Harmony V1.0中的 USB HOST中看到的,第一个结构体是函数指针列表,但这些函数指针并没有对应的同名函数。第二个结构是似乎是将第一个结构体中的函数指针对应到实际的函数。是不是这样呢? 标准的C能这样用还是Microchip编译器环境中的一种特殊用法?

第一个结构体:
typedef struct _SYS_FS_MEDIA
{
    /* If the media object is in use or is it free */
    bool inUse;
    /* Media driver index. The index is used to open the media driver */
    SYS_MODULE_INDEX  index;
    /* List of functions for the media driver */
    const SYS_FS_MEDIA_FUNCTIONS * mediaDriverFunctions;
    /* State of the media (Registered,  opened, attached, analyzed) */
    SYS_FS_MEDIA_STATE mediaState;
    /* Media driver object. This object is used to run the media task routine */
    SYS_MODULE_OBJ mediaDriverObject;
    /* Handle received after the media driver is opened */
    DRV_HANDLE  mediaDriverClientHandle;
    /* Type of the media */
    SYS_FS_MEDIA_TYPE   mediaType;
    /* Handle received when trying to read or write a sector from the media */
    SYS_FS_MEDIA_BUFFER_HANDLE  mediaBufferHandle;
    /* Status of media -- attached or detached */
    SYS_FS_MEDIA_STATUS mediaStatus;
    /* Number of partitions available in the media */
    uint8_t numberOfPartitions;
    /* Number identifying the media. This is a alphabet name for each media. It
       starts with a, b etc. */
    uint8_t mediaId;
    /* This is a count for media. For every new media (any type) registered, this
       counter is assigned a new value */
    uint8_t mediaCounter;
    /* Number of volumes that can be assigned in the present media. This reflects
       the number of partitions available on the media */
    uint8_t volumeCounter;
}
SYS_FS_MEDIA;

第二个结构体:
SYS_FS_MEDIA_FUNCTIONS scsiUSBMediaFunctions =
{
    .mediaStatusGet     = USB_HOST_SCSI_MediaStatusGet,
    .sectorRead         = USB_HOST_SCSI_SectorRead,
    .sectorWrite        = USB_HOST_SCSI_SectorWrite,
    .bufferStatusGet    = USB_HOST_SCSI_BufferStatusGet,
    .open               = USB_HOST_SCSI_Open,
    .close              = USB_HOST_SCSI_Close,
    .tasks              = USB_HOST_SCSI_Task_FS,
};

出20入70汤圆

发表于 2014-9-17 10:49:43 | 显示全部楼层
第一个是结构体定义;
第二个是结构体变量,同时在定义此变量的时候将内部成员初始化。 初始化使用的C99标准。

出0入0汤圆

 楼主| 发表于 2014-9-17 13:37:12 | 显示全部楼层
techbaby 发表于 2014-9-17 10:49
第一个是结构体定义;
第二个是结构体变量,同时在定义此变量的时候将内部成员初始化。 初始化使用的C99标 ...

有这样一个定义:volatile SYS_FS_MEDIA *media;  
那么下面这条语句调用的函数其实是 USB_HOST_SCSI_BUFFER_HANDLE USB_HOST_SCSI_SectorWrite (参数)这个函数?
因为在源文件中有 USB_HOST_SCSI_BUFFER_HANDLE USB_HOST_SCSI_SectorWrite (参数)函数的定义,并没有定义sectorWrite()函数。
media->mediaDriverFunctions->sectorWrite(media->mediaDriverClientHandle, sector, dataBuffer, noSectors);

出0入0汤圆

发表于 2014-9-17 13:58:02 | 显示全部楼层
techbaby 发表于 2014-9-17 10:49
第一个是结构体定义;
第二个是结构体变量,同时在定义此变量的时候将内部成员初始化。 初始化使用的C99标 ...

能详细说说第二个结构体变量吗,最好贴些资料上来,搜不到详细资料

出20入70汤圆

发表于 2014-9-17 14:10:02 | 显示全部楼层
YZY0707 发表于 2014-9-17 13:37
有这样一个定义:volatile SYS_FS_MEDIA *media;  
那么下面这条语句调用的函数其实是 USB_HOST_SCSI_BUF ...

对的。

说白了,就是函数指针。函数指针被赋值后,执行此指针就是执行此指针指向的函数。

出20入70汤圆

发表于 2014-9-17 14:11:33 | 显示全部楼层
majialou 发表于 2014-9-17 13:58
能详细说说第二个结构体变量吗,最好贴些资料上来,搜不到详细资料

知道怎么用的就行了。

再说,你应该找LZ要详细定义啊。我可没有啊!

出0入0汤圆

 楼主| 发表于 2014-9-17 15:12:26 | 显示全部楼层
majialou 发表于 2014-9-17 13:58
能详细说说第二个结构体变量吗,最好贴些资料上来,搜不到详细资料

我是在Microchip 的Harmony 库中看到的,库中有很多这种用法。第二个结构体定义的时初始化比较好理解,就是第一个结构体中的指针链接到第二中的指针理解起来有点变扭。查看程序上下文,应该就是这种链接关系。

出0入0汤圆

 楼主| 发表于 2014-9-17 16:27:37 | 显示全部楼层
techbaby 发表于 2014-9-17 14:10
对的。

说白了,就是函数指针。函数指针被赋值后,执行此指针就是执行此指针指向的函数。 ...

谢谢!看来对C语言还是知之甚少啊。

出0入8汤圆

发表于 2014-9-17 17:25:26 | 显示全部楼层
YZY0707 发表于 2014-9-17 16:27
谢谢!看来对C语言还是知之甚少啊。

在论坛或者 baidu 搜索下
高质量C++/C编程指南 (林锐 版本)
花点时间,认真研读下,相信对C,会有一个清晰的认知。

出0入0汤圆

 楼主| 发表于 2014-9-18 10:57:48 | 显示全部楼层
security 发表于 2014-9-17 17:25
在论坛或者 baidu 搜索下
高质量C++/C编程指南 (林锐 版本)
花点时间,认真研读下,相信对C,会有一个清 ...

嗯嗯, 好书要多看啊,挤出时间来看。

出0入0汤圆

发表于 2014-9-22 16:33:15 | 显示全部楼层
第一个是结构体原型,第二个是结构体定义和初始化。风格同linux风格。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 17:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表