我想知道这个定义片段中的gattCharCfg_t是如何使用的。
以下是“定义剪接:

    // Client Characteristic Configuration table (from CCC attribute value pointer)
      #define GATT_CCC_TBL( pValue )           ( (gattCharCfg_t *)(*((PTR_TYPE)(pValue))) )

下面是如何在给定代码中的几个位置访问它:
    // Characteristic Configuration: voltage
    static gattCharCfg_t *voltDataConfig;

      // Allocate Client Characteristic Configuration table
  voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
                                                    linkDBNumConns);
    if (voltDataConfig == NULL)
    {
      return (bleMemAllocError);
    }

我想我不理解访问它的机制。我非常希望你能给我一个更详细的解释,因为我刚刚回到c。

最佳答案

( (gattCharCfg_t *)(*((PTR_TYPE)(pValue))) )

(PTR_TYPE)(pValue)-将pValue转换为PTR\u类型(指针)
*((PTR_TYPE)(pValue))-查看指针指向的内存位置
(gattCharCfg_t *)(*((PTR_TYPE)(pValue)))-指针指向gattCharCfg_t结构(可以是gattCharCfg_t的数组)而不是void*
GATT_CCC_TBL是一个宏,用于快捷方式,必须写出转换。关于你帖子里的另一个密码,
  voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
                                                    linkDBNumConns);

sizeof(gattCharCfg_t)-取gattCharCfg_t的大小,例如23字节
* linkDBNumConns-乘以linkDBNumConns,例如,100,生成2300字节
ICall_malloc(..)-分配那么多内存
(gattCharCfg_t *)-将内存中的该位置转换为指向gattCharCfg_t结构的指针
更新。看起来这段代码来自蓝牙协议栈,在这种情况下
typedef struct
{
  uint16 connHandle; //!< Client connection handle
  uint8  value;      //!< Characteristic configuration value for this client
} gattCharCfg_t;

因此,GATT_CCC_TBL( pValue )将获取一个指针值pValue并将它指向的内容转到一个或多个gattCharCfg结构-很可能是这些结构的数组,因为TBL很可能是“table”。

08-16 02:04