2013-08-19 76 views
0

在我的节目我使用结构,如:解构结构

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

然后:

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

那我想接下来做是要收回的花车3 2维表和分开使用它们。要做到这一点我使用:

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

@Kevin:1.我吃了*。 2.这只是我正在做的一个例子。 – Qiu

+0

我希望在你的实际代码中'b'被初始化。 – Medinoc

+0

@Medinoc:当然是;) – Qiu

回答

1

有多种方法,这里有掠过我脑海的第一个:

  1. 检查mask一次,并选择不同的循环,只是做了正确的事情,假设mask永远不会改变的循环。
  2. 检查mask一次,然后计算每个rval的底部的指针偏移量,并使用它来复制浮点数。这个任务会变得像f[i][j] = *(float *) ((char *) b.rval[i][j] + offset);这看起来很可怕,但应该编译成一些体面的。
  3. 使用union覆盖一个阵列与s1,s2s3字段,所以你可以做f[i][j] = b.rval[i][j].u.array[mask];或类似的东西。
  4. 检查mask一次,并将函数指针设置为正确的赋值函数。但是,如果函数调用很昂贵,这可能会很昂贵。

我可能会去第一或第二。

0

使用宏替换或指向一个-d阵列像这样:

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

// ... 

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

似乎好一点:)。