0

我有一个这样的结构:

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 };

根据标准输入的一些值,它设置正确。

“问题”是我从字符串中检索它,我需要正确设置它。我目前正在使用此功能:

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。

任何建议都非常受欢迎。提前致谢。

4

3 回答 3

5

你为什么不这样做:

static struct F_t {
    char ** _;
} F = { 0 };

此时,只需确保您 malloc 为大小为 12 的双精度数组(在您的情况下),然后您就可以拥有如下功能:

setf(int i, char *value)
{
     F._[i] = value;
}

事情看起来好多了,不是吗?

于 2012-07-27T15:27:10.367 回答
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 */
}
于 2012-07-27T15:29:07.433 回答
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] -> F_as_array[i-1] (根据您提供的代码,我假设第一个索引是 1)

于 2012-07-27T15:29:43.500 回答