我有一个包含大量信息的结构数组,这些信息在编译时将是一个常量。我正在尝试初始化数组,以便与特定变量相关的所有信息都在一个位置。我遇到的问题是数据类型可以是var_ptr或var_max的任何数字类型(另一个成员跟踪处理的类型)。
我使用void *作为指针,但我需要一些方法来分配内存并初始化它。请参阅下面注释掉的.var_max =&(23),了解我正在努力实现的目标。
typedef enum{
INT,
CHAR,
LONG,
LONGLONG,
FLOAT
} data_type_t;
typedef struct param_t param_t;
struct param_t{
const char* name; //Text name of variable
const void* var_ptr; //Pointer to variable
const void* var_max; //Pointer to max limit of var_ptr, same datatype
int (*p_func)(const param_t*, char *);//Function to process parameter variable
const data_type_t data_type; //Data type of
};
int MinMax_handler(const param_t *, char *);
extern int Hours, Minutes, Seconds;
/******************Variables go here******************/
const param_t param[] =
{
{.name = "DEV_RTC_HR", .var_ptr = &Hours, /*.var_max = &(23),*/ .p_func = &MinMax_handler, .data_type = INT},
{.name = "DEV_RTC_MIN", .var_ptr = &Minutes, .p_func = &MinMax_handler, .data_type = INT},
{.name = "DEV_RTC_SEC", .var_ptr = &Seconds, .p_func = &MinMax_handler, .data_type = INT}
};
/*****************************************************/
注释掉.var_max =&(23)允许它编译并且似乎工作正常。
这听起来像一个联合可能会工作,但会占用更多的内存,因为大多数数据类型将是int(16位)但我需要适应很长的(64位)。
我需要将此限制为C.最终版本将是50-150个数组元素,并在外部自动生成。
答案 0 :(得分:0)
通过执行.var_max = &(23)
,你试图创建一个指向文字值的指针,这没有任何意义
你可以做以下两件事之一:
预分配内存,将值23放在那里,并将其用作指针
假设当数据的大小适合void *
(即64位或更少,假设您在64位拱门上)时,您可以直接将值放入指针
.var_max =(void *)23
答案 1 :(得分:0)
您需要一个操作员地址可以操作的对象,例如
long twentythree = 23L;
/* ... */, .var_max = &twentythree, /* ... */