我试图找到一个通用的方法来初始化带有参数值的数组或结构。当从数组或结构中消耗参数时,我的函数将知道上下文,因此它将知道如何正确使用这些值。
要初始化数组/结构,我想做这样的事情:
const void *para[] = { // General Purpose store for parameters
"1234", // Store string pointer
(void *)1234, // Store integer value
(void *)12.34f, // Store float value
};
字符串和整数参数类型都可以。 float不起作用,因为编译器没有将float转换为void指针的方法。
我需要的是一种将浮点值转换为二进制表示的方法,因此可以将其视为32位无符号整数。可以这样做吗?
我可以用memcpy()的强力解决这个问题,但这需要' const'即将被删除。最终目标是将代码移植到具有有限SRAM的嵌入式ARM系统,因此阵列/结构需要位于ROM中,因此需要由编译器初始化,而不是在运行时。
答案 0 :(得分:4)
使用结构而不是数组。
struct s_para { const char* a; int b; float c; } const para
= { "1234", 1234, 12.34f };
无需施放任何东西。
答案 1 :(得分:1)
您的通用数据数组包含void指针。指向未定义数据类型的指针。在许多系统上,指向大多数数据类型的指针的大小不会变化,因此它指向的内容并不重要。这只有在进行指针算术或访问内容时才会变得相关。你可能知道这一点。正如你所说的那样,你的代码后来就会知道"在什么上下文中使用哪个指针。到现在为止还挺好。我们假设我们有一个32位系统,因为它匹配您的数据类型。
现在你的类型:
两种选择: 首先,将int和float存储在text / constant部分中,然后将指针放在我的数组中。但是我们必须预先存储这些值...(或者可能有一个花哨的技巧)。这适用于任何类型!:
static int v1 = 1234;
static float v2 = 12.34f;
const void *para[] = { // General Purpose store for parameters
"1234", // Store string pointer
&v1, // Store integer value
&v2, // Store float value
};
第二,我喜欢的方式是使用联盟。
union data_storage {
const int t_int;
const float t_float;
const char *t_string;
};
const union data_storage params[] = { // General Purpose store for parameters
{.t_string = "1234"}, // Store string pointer
{.t_int = 1234}, // Store integer value
{.t_float = 12.34f}, // Store float value
};
我用
测试了它fprintf(stdout, "%s\n%i\n%f\n", params[0].t_string, params[1].t_int, params[2].t_float);