第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;
}