我想知道这个定义片段中的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”。