2014年12月15日月曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の5章(構造体、共用体、ビットフィールド: 独自の構造を使う)、コードマグネット(p.256)を解いてみる。

その他参考書籍

コードマグネット(p.256)

コード(BBEdit, Emacs)

sample256.c

typedef enum {
  COUNT, POUNDS, PINTS
} unit_of_measure;

typedef union quantity {
  short count;
  float weight;
  float volume;
} quantity;

typedef struct fruit_order {
  const char *name;
  const char *country;
  union {
    quantity amount;
    union quantity;
  };
  unit_of_measure units;
} fruit_order;

void display(fruit_order order)
{
  printf("この注文に含まれるものは");
  switch (order.units) {
  case PINTS:
    printf("%2.2fパイントの%sです。\n", order.volume, order.name);
    break;
  case POUNDS:
    printf("%2.2fポンドの%sです。\n", order.weight, order.name);
    break;
  case COUNT:
    printf("%i個の%sです。\n", order.count, order.name);
    break;
  default:
    break;
  }
}

int main()
{
  fruit_order apples = {.name="リンゴ", .country="イギリス", .count=144,
                        .units=COUNT};
  fruit_order strawberries = {.name="いちご", .country="スペイン", .weight=17.6,
                              .units=POUNDS};
  fruit_order oj = {.name="オレンジジュース", .country="アメリカ", .volume=10.5,
                    .units=PINTS};
  fruit_order orders[] = {apples, strawberries, oj};
  for (int i = 0; i < 3; i++)
    display(orders[i]);
}

入出力結果(Terminal)

$ crun.sh sample256
...
sample256.c:16:5: warning: anonymous structs are a Microsoft extension
      [-Wmicrosoft]
    union quantity;
    ^~~~~
1 warning generated.
この注文に含まれるものは144個のリンゴです。
この注文に含まれるものは17.60ポンドのいちごです。
この注文に含まれるものは10.50パイントのオレンジジュースです。
$

0 コメント:

コメントを投稿