2013-08-19 35 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; 

似乎好一點:)。