0

私はこのような構造体を持っています:

static struct F_t {
  char *_1;
  char *_2;
  char *_3;
  char *_4;
  char *_5;
  char *_6;
  char *_7;
  char *_8;
  char *_9;
  char *_10;
  char *_11;
  char *_12;
} F = { 0 };

標準入力からのいくつかの値によると、適切に設定されています。

「問題」は、文字列から取得することであり、適切に設定する必要があります。私は現在この機能を使用しています:

static inline void 
setf(int i, char *value)
{
  /* Nothing to do. */
  if(i > 12)
    return;

  if(i == 1)
    F._1 = value;
  else if(i == 2)
    F._2 = value;
  else if(i == 3)
    F._3 = value;
  else if(i == 4)
    F._4 = value;
  else if(i == 5)
    F._5 = value;
  else if(i == 6)
    F._6 = value;
  else if(i == 7)
    F._7 = value;
  else if(i == 8)
    F._8 = value;
  else if(i == 9)
    F._9 = value;
  else if(i == 10)
    F._10 = value;
  else if(i == 11)
    F._11 = value;
  else if(i == 12)
    F._12 = value;
}

マクロを使用してみましたが、実行時に設定されているため、できません。反省がなければ、こういう現代的なものもあると思います。おそらくC++で可能です。しかし、いいえ。純粋な C が欲しいです。

どんな提案でも非常に感謝しています。前もって感謝します。

4

3 に答える 3

5

なぜあなたはこれをしないのですか:

static struct F_t {
    char ** _;
} F = { 0 };

この時点で、サイズ 12 の倍精度配列 (この場合) に対して malloc していることを確認してください。そうすれば、次のような関数を作成できます。

setf(int i, char *value)
{
     F._[i] = value;
}

物事はずっと良く見えますか?

于 2012-07-27T15:27:10.367 に答える
3

配列を使用するという@PhillipNordwallの提案を考慮することを強くお勧めします。これは、コンパイラが構造体フィールドをパディングなしでパックすると仮定して機能します。

static inline void 
setf(int i, char *value)
{
   char **p = &F._1;  /* obtain the address of the first field in the struct */
   p+= i - 1;         /* add an offset to the address according to index */
  /* Nothing to do. */
  if(i > 12)
    return;

   *p = value;        /* set the field's value */
}
于 2012-07-27T15:29:07.433 に答える
1

これを試して:

static inline void  setf(int i, char *value) 
{
    char** F_as_array = (char**)(&F._1);

    if (i > 12 || i < 1) 
        return;

    F_as_array[i-1] = value; 
}

(私はそれをコンパイルしていませんが、うまくいくと思います)

編集: F_as_array[i] -> F_as_array[i-1] (提供されたコードから、最初のインデックスは 1 であると仮定します)

于 2012-07-27T15:29:43.500 に答える