0

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

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;

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

4

2 回答 2

1

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

  1. 检查mask once,并选择一个不同的循环来做正确的事情,假设mask循环中永远不会改变。
  2. 检查mask一次并计算从每个基数的指针偏移量rval,并使用它来复制浮点数。作业会变成f[i][j] = *(float *) ((char *) b.rval[i][j] + offset);看起来很吓人但应该编译成体面的东西。
  3. 使用 a用,和字段union覆盖数组,以便您可以执行或类似的操作。s1s2s3f[i][j] = b.rval[i][j].u.array[mask];
  4. 检查mask一次并将函数指针设置为正确的赋值函数。但是,如果函数调用很昂贵,这可能会很昂贵。

我可能会选择第一个或第二个。

于 2013-08-19T15:18:51.340 回答
0

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

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

// ...

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

似乎好一点:)。

于 2013-08-19T17:05:24.043 回答