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;

しかし、私はそれをより良くする方法があるべきだと思います。だから私の質問は次のとおりです。どうすればそれを行うことができますか?

4

2 に答える 2

1

いくつかの方法がありますが、最初に頭に浮かんだのは次のとおりです。

  1. mask onceを検査し、ループ内で変更がないと仮定して、正しいことを行う別のループを選択しmaskます。
  2. 一度検査maskし、各 のベースからのポインター オフセットを計算しrval、それを使用して float をコピーします。割り当ては、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て、関数ポインタを適切な代入関数に設定します。ただし、関数呼び出しが高価な場合、これは高価になる可能性があります。

私はおそらく最初か2番目に行きます。

于 2013-08-19T15:18:51.340 に答える
0

次のように、マクロ置換または 1 次元配列へのポインターを使用します。

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

// ...

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

少し良くなったようです:)。

于 2013-08-19T17:05:24.043 に答える