我有这样的结构:
static struct F_t {
char *_1;
char *_2;
char *_3;
char *_4;
char *_5;
char *_6;
char *_7;
char *_8;
char *_9;
char *_10;
char *_11;
char *_12;
} F = { 0 };
根据stdin的一些值,它已正确设置。
“问题”是我从字符串中检索它,我需要正确设置它。我目前正在使用此功能:
static inline void
setf(int i, char *value)
{
/* Nothing to do. */
if(i > 12)
return;
if(i == 1)
F._1 = value;
else if(i == 2)
F._2 = value;
else if(i == 3)
F._3 = value;
else if(i == 4)
F._4 = value;
else if(i == 5)
F._5 = value;
else if(i == 6)
F._6 = value;
else if(i == 7)
F._7 = value;
else if(i == 8)
F._8 = value;
else if(i == 9)
F._9 = value;
else if(i == 10)
F._10 = value;
else if(i == 11)
F._11 = value;
else if(i == 12)
F._12 = value;
}
我尝试过使用宏..但是因为它是在运行时设置的,所以不可能。我知道,如果没有反思,像这样的现代事物,等等。但也许有一些我不知道的东西。可能在C ++中是可能的。但不是。我想要纯粹的C.
任何建议都非常有意义。提前谢谢。
答案 0 :(得分:5)
你为什么不这样做:
static struct F_t {
char ** _;
} F = { 0 };
此时,只需确保malloc为大小为12的双数组(在您的情况下),然后您可以使用如下函数:
setf(int i, char *value)
{
F._[i] = value;
}
事情看起来好多了没有?
答案 1 :(得分:3)
除了强烈建议考虑@ PhillipNordwall建议使用数组。这可以起作用,假设编译器将打包结构字段,而它们之间没有任何填充。
static inline void
setf(int i, char *value)
{
char **p = &F._1; /* obtain the address of the first field in the struct */
p+= i - 1; /* add an offset to the address according to index */
/* Nothing to do. */
if(i > 12)
return;
*p = value; /* set the field's value */
}
答案 2 :(得分:1)
试试这个:
static inline void setf(int i, char *value)
{
char** F_as_array = (char**)(&F._1);
if (i > 12 || i < 1)
return;
F_as_array[i-1] = value;
}
(我没有编译它,但我认为它有效)
编辑:F_as_array [i] - &gt; F_as_array [i-1](从你提供的代码中,我假设第一个索引是1)