第10話 共用体


union01.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * ビットの構造体&共用体

 */

#include <stdio.h>

 

union rcd

{

    int     i;

    short   s;

    char    ca;

    char    cb[4];

};

 

int main(void)

{

    union rcd record;

 

    record.i=0x41424344;

 

    printf("record.i  =0x%08X\n",record.i);

 

    printf("record.s  =0x%04X\n",record.s);

 

    printf("record.ca =%C\n",record.ca);

 

    printf("record.cb =%C%C%C%C\n",record.cb[0],

                                    record.cb[1],

                                        record.cb[2],

                                            record.cb[3]);

 

    return 0;

}


unionbits01.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * ビットの構造体&共用体

 */

#include <stdio.h>

 

struct  t_br_bits

{

    /* Bus reset register (Little Endian) */

    unsigned int    nridval:1,

                    rsvd1:1,

                    nodecount:6,

                    root:1,

                    contndr:1,

                    irmnodeid:6,

                    busnumber:10,

                    nodenumber:6 ;

};

 

union t_br

{

    struct t_br_bits bit ;

    unsigned int     reg ;

};

 

int main(void)

{

    union t_br br;

 

    /*memset(&br,0,4);*/

    br.reg=0;

    printf("br.reg=0x%08X\n",br);

 

    br.bit.root = 1;

    br.bit.nodenumber = 63;

    br.bit.busnumber = 1023;

    printf("br.reg=0x%08X\n",br.reg);

 

    return 0;

}


unionbits01_bigendian.c

書籍には掲載されていません、エンディアンをbigに変更したものです。

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * ビットの構造体&共用体

 */

#include <stdio.h>

 

struct  t_br_bits

{

    /* Bus reset register (Big Endian) */

    unsigned int    nodenumber:6,

                    busnumber:10,

                    irmnodeid:6,

                    contndr:1,

                    root:1,

                    nodecount:6,

                    rsvd1:1,

                    nridval:1 ;

};

 

union t_br

{

    struct t_br_bits bit ;

    unsigned int     reg ;

};

 

int main(void)

{

    union t_br br;

 

    /*memset(&br,0,4);*/

    br.reg=0;

    printf("br.reg=0x%08X\n",br);

 

    br.bit.root = 1;

    br.bit.nodenumber = 63;

    br.bit.busnumber = 1023;

    printf("br.reg=0x%08X\n",br.reg);

 

    return 0;

}


enum01.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

 

#define def0 0

#define def1 1

#define def2 2

#define defNum 3

 

int main(void)

{

    int i;

 

    for(i=0; i<defNum; i++)

    {

        switch(i)

        {

        case def0:

            printf("def0 = %d\n", i);

            break;

        case def1:

            printf("def1 = %d\n", i);

            break;

        case def2:

            printf("def2 = %d\n", i);

            break;

       default:

            break;

        }

    }

 

    return 0;

}


enum02.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

 

enum e

{

    e0,

    e1,

    e2,

    eNum

};

 

int main(void)

{

    int i;

 

    for(i=0; i<eNum; i++)

    {

        switch(i)

        {

        case e0:

            printf("e0 = %d\n", i);

            break;

        case e1:

            printf("e1 = %d\n", i);

            break;

        case e2:

            printf("e2 = %d\n", i);

            break;

        default:

            break;

        }

    }

    printf("eNum = %d\n", eNum);

 

    return 0;

}


enum03.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

 

enum e

{

    e0,

    e1,

    e2,

    eNum

};

 

int main(void)

{

    int i;

 

    for(i=0; i<e.eNum; i++)

    {

        switch(i)

        {

        case e.e0:

            printf("e.e0 = %d\n", i);

            break;

        case e.e1:

            printf("e.e1 = %d\n", i);

            break;

        case e.e2:

            printf("e.e2 = %d\n", i);

            break;

        default:

            break;

        }

    }

    printf("e.eNum = %d\n", e.eNum);

 

    return 0;

}


enum04.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

 

enum e0

{

    e0,

    e1,

    e2,

    eNum

};

enum e1

{

    e0,

    e1,

    e2,

    eNum

};

 

int main(void)

{

    printf("e0.eNum = %d\n", e0.eNum);

    printf("e1.eNum = %d\n", e1.eNum);

 

    return 0;

}


enum05.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

 

enum e

{

    e0,

    e1,

    e2,

    eNum

};

enum e ei;

 

int main(void)

{

    int i = 10;

    short s =20;

    char c = 30;

    int *pi = &i;

 

    printf("size of ei = %d, e0 = %d, e1 = %d, e2 = %d, eNum = %d\n",

        sizeof ei, e0, e1, e2, eNum);

 

    ei = e0;

    printf("ei = %d\n", ei);

    ei = i;

    printf("ei = %d\n", ei);

    ei = s;

    printf("ei = %d\n", ei);

    ei = c;

    printf("ei = %d\n", ei);

/*  ei = pi; */                 /* コンパイルエラー */

 

    i = ei;

    printf("i = %d\n", i);

    s = ei;

    printf("s = %d\n", s);

    c = ei;

    printf("c = %d\n", c);

/*  pi = ei; */                 /* コンパイルエラー */

 

    return 0;

}


enum06.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

 

enum e

{

    e0 = 10,

    e1,

    e2 = 20,

    e3

};

 

int main(void)

{

    printf("e0 = %d, e1 = %d, e2 = %d, e3 = %d\n", e0, e1, e2, e3);

 

    return 0;

}


enumGame01.c

/*

 * (c)Copyright Spacesoft corp., 2006 All rights reserved.

 *

 * 列挙型

 */

#include <stdio.h>

#include <stdlib.h>

 

/* ゲーム参加者が取り得る状態 */

enum janken_st

{

    jstSt,      /* スタート状態 */

    jstWon1,    /* 後一回勝てばアイス状態 */

    jstWon2,    /* やった、アイスだ!状態 */

    jstNum      /* 状態数 */

};

char *jst_string[] =

    { "スタート状態", "後一回勝てばアイス状態", "やった、アイスだ!状態" };

 

/* 状態毎に発生し得るイベント */

enum janken_ev

{

    jevWon,     /* 勝ち */

    jevLost,    /* 負け */

    jevEven,    /* あいこ */

    jevNum      /* イベント数 */

};

 

/* グー、チョキ、パー */

enum janken_kind

{

    jkdGoo,     /* グー */

    jkdChoki,   /* チョキ */

    jkdPaa,     /* パー */

    jkdNum      /* じゃんけんの手数 */

};

char *jkd_string[] = { "グー ", "チョキ", "パー " };

 

typedef enum janken_st JST;

typedef enum janken_ev JEV;

typedef enum janken_kind JKD;

 

/*

 *  スタート状態でスケジュールされる関数群

 */

    /* じゃんけんに勝った */

    JST jstSt_jstWon(JST currentSt)

    {

        return jstWon1;

    }

 

    /* じゃんけんに負けた */

    JST jstSt_jstLost(JST currentSt)

    {

        return jstSt;

    }

 

    /* あいこ */

    JST jstSt_jstEven(JST currentSt)

    {

        return currentSt;

    }

 

/*

 *  後一回勝てばアイス状態でスケジュールされる関数群

 */

    /* じゃんけんに勝った */

    JST jstWon1_jstWon(JST currentSt)

    {

        return jstWon2;

    }

 

    /* じゃんけんに負けた */

    JST jstWon1_jstLost(JST currentSt)

    {

        return jstSt;

    }

 

    /* あいこ */

    JST jstWon1_jstEven(JST currentSt)

    {

        return currentSt;

    }

 

/*

 *  やった、アイスだ!状態でスケジュールされる関数群

 */

    /* じゃんけんに勝った */

    JST jstWon2_jstWon(JST currentSt)

    {

        return currentSt;

    }

 

    /* じゃんけんに負けた */

    JST jstWon2_jstLost(JST currentSt)

    {

       return currentSt;

    }

 

    /* あいこ */

    JST jstWon2_jstEven(JST currentSt)

    {

        return currentSt;

    }

 

/*

 *  状態遷移表

 */

JST (*janken_func[jstNum][jevNum])(JST currentSt) =

{

               /* イベント                                          */

               /* 勝ち            負け             あいこ           */

/* 状態 */

/* スタート状態 */

                { jstSt_jstWon,   jstSt_jstLost,   jstSt_jstEven },

 

/* 後一回勝てばアイス状態 */

                { jstWon1_jstWon, jstWon1_jstLost, jstWon1_jstEven },

 

/* やった、アイスだ!状態 */

                { jstWon2_jstWon, jstWon2_jstLost, jstWon2_jstEven }

};

 

int main(void)

{

    JST jstA;   /* ゲーム参加者Aの状態 */

    JST jstB;   /* ゲーム参加者Bの状態 */

 

    JEV jevA;   /* ゲーム参加者Aのイベント */

    JEV jevB;   /* ゲーム参加者Bのイベント */

 

    JKD jkdA;   /* ゲーム参加者Aが出したじゃんけんの手 */

    JKD jkdB;   /* ゲーム参加者Bが出したじゃんけんの手 */

 

    jstA = jstSt;

    jstB = jstSt;

 

    printf("参加者Aの現在状態=%s\n", jst_string[jstA]);

    printf("参加者Bの現在状態=%s\n", jst_string[jstB]);

 

    srand( 1 );

    while( 1 )

    {

        jkdA = rand()%jkdNum;

        jkdB = rand()%jkdNum;

 

        switch(jkdA)

        {

        case jkdGoo:

            switch(jkdB)

            {

            case jkdGoo:

                jevA = jevEven;

                jevB = jevEven;

                break;

            case jkdChoki:

                jevA = jevWon;

                jevB = jevLost;

                break;

            case jkdPaa:

            default:

                jevA = jevLost;

                jevB = jevWon;

                break;

            }

            break;

        case jkdChoki:

            switch(jkdB)

            {

            case jkdGoo:

                jevA = jevLost;

                jevB = jevWon;

                break;

            case jkdChoki:

                jevA = jevEven;

                jevB = jevEven;

                break;

            case jkdPaa:

            default:

                jevA = jevWon;

                jevB = jevLost;

                break;

            }

            break;

        case jkdPaa:

        default:

            switch(jkdB)

            {

            case jkdGoo:

                jevA = jevWon;

                jevB = jevLost;

                break;

            case jkdChoki:

                jevA = jevLost;

                jevB = jevWon;

                break;

            case jkdPaa:

            default:

                jevA = jevEven;

                jevB = jevEven;

                break;

            }

            break;

        }

 

        jstA = janken_func[jstA][jevA](jstA);

        jstB = janken_func[jstB][jevB](jstB);

 

        printf("参加者Aの手=%s, 新しい状態=%s\n",

            jkd_string[jevA], jst_string[jstA]);

        printf("参加者Bの手=%s, 新しい状態=%s\n",

            jkd_string[jevB], jst_string[jstB]);

 

        if(jstA == jstWon2)

        {

            printf("ゲームオーバ。Aの勝ち\n");

            break;

        }

        else

        if(jstB == jstWon2)

        {

            printf("ゲームオーバ。Bの勝ち\n");

            break;

        }

 

        sleep( 1 );

    }

 

    return 0;

}

もどる