解构结构

时间:2013-08-19 15:14:32

标签: c struct

在我的程序中,我使用的结构如下:

typedef struct R{
    float s1;
    float s2;
    float s3;
}Rtype;

然后:

typedef struct Z{
    Rtype rval[8][8];
}Ztype;

接下来我要做的是恢复浮动的3个二维表并单独使用它们。要做到这一点,我使用:

Ztype* b;
float f[8][8];
for(int i = 0; i < 8; i++)
   for(int j = 0; j < 8; j++)
      if(mask == 0)
        f[i][j] = b->rval[i][j].s1;
      else if(mask ==1)
        f[i][j] = b->rval[i][j].s2;
      else
        f[i][j] = b->rval[i][j].s3;

但我认为应该有办法做得更好。所以我的问题是:我该怎么做?

2 个答案:

答案 0 :(得分:1)

有几种方法,这是第一个让我想到的方法:

  1. 检查mask 一次,然后选择一个不同的循环来做正确的事情,假设mask永远不会在循环中发生变化。
  2. 检查mask一次并计算从每个rval的基础偏移的指针,并使用它来复制浮点数。赋值将变成类似f[i][j] = *(float *) ((char *) b.rval[i][j] + offset);的东西,它看起来很可怕,但应该编译成体面的东西。
  3. 使用union覆盖包含s1s2s3字段的数组,以便您可以执行f[i][j] = b.rval[i][j].u.array[mask];或类似的操作。< / LI>
  4. 检查mask一次,并设置指向正确赋值功能的函数指针。但是,如果函数调用很昂贵,这可能会很昂贵。
  5. 我可能会选择第一个或第二个。

答案 1 :(得分:0)

使用宏替换或指向一维数组的指针,如下所示:

Rtype (* pRval)[8] = b->rval;

// ...

f[i][j] = pRval[i][j].si;

似乎好一点:)。