在我的程序中,我使用的结构如下:
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;
但我认为应该有办法做得更好。所以我的问题是:我该怎么做?
答案 0 :(得分:1)
有几种方法,这是第一个让我想到的方法:
mask
一次,然后选择一个不同的循环来做正确的事情,假设mask
永远不会在循环中发生变化。mask
一次并计算从每个rval
的基础偏移的指针,并使用它来复制浮点数。赋值将变成类似f[i][j] = *(float *) ((char *) b.rval[i][j] + offset);
的东西,它看起来很可怕,但应该编译成体面的东西。union
覆盖包含s1
,s2
和s3
字段的数组,以便您可以执行f[i][j] = b.rval[i][j].u.array[mask];
或类似的操作。< / LI>
mask
一次,并设置指向正确赋值功能的函数指针。但是,如果函数调用很昂贵,这可能会很昂贵。我可能会选择第一个或第二个。
答案 1 :(得分:0)
使用宏替换或指向一维数组的指针,如下所示:
Rtype (* pRval)[8] = b->rval;
// ...
f[i][j] = pRval[i][j].si;
似乎好一点:)。