法大奥山研究室

 previous  contents

11.4. 構造体の構造体


 構造体は,様々な要素から構成されるものを1つのユニットにし,理解しやくされた工夫です。そこで,ユニットを幾つも作り,それらのユニットからなるユニットも考えられます。それが「構造体の構造体」です。

 例えば,文献リストの場合,分野別に分けて作成する方法が考えられます。分野の名称を付してリストを作成するのであれば,文献リストは次の変数を持つことになります。

char   class[32];        /* 分野 (classification) */
struct ref paper[100];   /* この分野の論文リスト */

これら2つの要素をもつユニットも作成できる訳です。

/* Example 11.9 */

#include <stdio.h>
#include <string.h>

struct ref {
       char author[40];        /* 著者 */
       char title[80];         /* タイトル */
       int  year;              /* 発行年 */
       char resource[120];     /* 出典元 */
};

struct list {
       char   class[32];       /* 分野 31字以内 */
       struct ref paper[100];
} list;

int main(void)
{
       memcpy(list.class, "Game Theory", sizeof(list.class)-1);
       memcpy(list.paper[0].author,
              "J. von Neumann", sizeof(list.paper[0].author)-1);
       memcpy(list.paper[0].title,
              "Zur Theorie der Gesellschaftsspiele",
              sizeof(list.paper[0].title)-1);
       memcpy(list.paper[0].resource,
              "Mathematische Annalen", sizeof(list.paper[0].resource)-1);
       list.paper[0].year = 1928;

       printf("[AU] %s\n", list.paper[0].author);
       printf("[TI] %s\n", list.paper[0].title);
       printf("[YR] %d\n", list.paper[0].year);
       printf("[SO] %s\n", list.paper[0].resource);
       printf("[FI] %s\n", list.class);

       return 0;
}

構造体 listchar型配列 class と構造体ref型配列 paper から構成され,構造体list型オブジェクト list が文献リスト全体を意味することとなります。

/* Example 11.10 */

#include <stdio.h>

struct s {
       char c;
       char str[12];
};

struct st {
       int n;
       struct s x;
} y[20] = {
       {1, {'a', "first"}},
       {2, {'b', "second"}},
       {3, {'c', "third"}}
};

int main(void)
{
       int i;
       for (i = 0; y[i].n != 0; i++)
              printf("y[%d] %d %c %s\n", i, y[i].n, y[i].x.c, y[i].x.str);
       return 0;
}

Example 11.10 の実行結果です。

y[0] 1 a first
y[1] 2 b second
y[2] 3 c third

 previous  contents