構造体の構造体宣言にメンバ変数として変数の他に構造体変数を加えてみます

アレサ「さきほどはPlayerStatusDataの構造体宣言に


メンバ変数として


int型の変数

cleartimequest1

cleartimequest2

cleartimequest3

を加えました。


PlayerStatusDataの構造体宣言は


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

}PlayerStatusData;

から


次のように変化したわけです。


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;


すこし表現が長くなりました。


そこで


3つの変数宣言

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;を


以下のように構造体宣言Allcleartimequestをおこなうことにより

👇

typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


1つの


構造体変数宣言 Allcleartimequest Allcleartimequest1;


           👆

(Allcleartimequest1の構造体変数宣言、

この1文で

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;の代わりになります)


にまとめてみます。


そして


これら


Allcleartimequestの構造体宣言とAllcleartimequest1の構造体変数宣言を


さきほどのPlayerStatusDataの構造体宣言

👇

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3

}PlayerStatusData;


に代入すると


typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;


となります。


構造体宣言が2つになりました


構造体PlayerStatusDataの中の


構造体変数宣言Allcleartimequest Allcleartimequest1;


が機能するためには


構造体宣言Allcleartimequest

👇

typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


の定義が


PlayerStatusDataの構造体宣言

👇

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;


の前に定義される必要があります。


つまり


構造体Allcleartimequest 


が定義されていないのに


構造体PlayerStatusDataに


構造体変数宣言Allcleartimequest Allcleartimequest1:


を加えても


機能しないということなんですの



そのとき


構造体変数Allcleartimequest1を格納した


構造体宣言 PlayerStatusDataをもちいて


typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;

👆ですね


さきほどの


player1の

HP

MP

AP

TP

クエストクリア時間

cleartimequest1

cleartimequest2

cleartimequest3

データ

10

8

22

18

150

7800

123800


格納してみます。


構造体変数宣言


PlayerStatusData player1StatusData;


を実行することにより


構造体PlayerStatusData型の構造体変数 player1StatusDataのメンバ変数に格納することができます。


このとき


構造体PlayerStatusData型の構造体変数 player1StatusDataのメンバ変数は


player1StatusData.HP


player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3


となります」



ソーラー「メンバ変数が長くなっている!


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3



アレサ「そして


player1StatusData.HP=10;

player1StatusData.MP=8;

player1StatusData.AP=22;

player1StatusData.TP=18;

player1StatusData.Allcleartimequest1.cleartimequest1=150;

player1StatusData.Allcleartimequest1.cleartimequest2=7800;

player1StatusData.Allcleartimequest1.cleartimequest3=123800;


のように


データを格納することができます。」


ソーラー「これは一体どういう仕組みなのかな?」


アレサ「


構造体変数 player1StatusDataのメンバ変数は


player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3


なっています。


つまり


構造体


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;



メンバ変数

cleartimequest1

cleartimequest2

cleartimequest3


にデータを格納する場合は


構造体変数宣言


PlayerStatusData player1StatusData;


を行い


player1StatusData.cleartimequest1 = 150;

player1StatusData.leartimequest2 = 7800;

player1StatusData.cleartimequest3 = 123800;


としました。


同様に


構造体


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;



メンバ変数

HP

MP;

AP

TP

Allcleartimequest1


にデータを格納する場合は


構造体変数宣言


PlayerStatusData player1StatusData;


を行い


構造体変数player1StatusDataのメンバ変数


player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1


にデータを格納することになります。


このとき


player1の

HP

MP

AP

TP


クエストクリア時間


cleartimequest1

cleartimequest2

cleartimequest3

データ

10

8

22

18

150

7800

123800

構造体変数player1StatusDataのメンバ変数


player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1


に格納していくことになります


player1StatusData.HP = 10;

player1StatusData.MP = 8;

player1StatusData.AP = 22;

player1StatusData.TP = 18;


までは今まで通りですね。


次に


クエストクリア時間


cleartimequest1  150

cleartimequest 7800

cleartimequest 123800



構造体変数player1StatusDataのメンバ変数


player1StatusData.Allcleartimequest1にデータを格納していきます。


その際は


player1StatusData.Allcleartimequest1の部分を


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3


と表記し


player1StatusData.Allcleartimequest1.cleartimequest1 = 150;

player1StatusData.Allcleartimequest1.cleartimequest2 = 7800;

player1StatusData.Allcleartimequest1.cleartimequest3 = 123800;


のようにデータを格納します。


このように


構造体変数Allcleartimequest1を経由して


構造体

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;


のメンバ変数

cleartimequest1

cleartimequest2

cleartimequest3


にデータを格納しているというわけです。


構造体変数Allcleartimequest1のメンバ変数は


Allcleartimequest1.cleartimequest1

Allcleartimequest1.cleartimequest2

Allcleartimequest1.cleartimequest3


となっており


さらに


構造体変数player1StatusDataのメンバ変数は


構造体変数player1StatusData.Allcleartimequest1となっているというわけです。


(ドット).演算子を用いて


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3 ;


と表記することにより


構造体


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;


のメンバ変数


cleartimequest1

cleartimequest2

cleartimequest3


アクセスしてデータを代入しているというわけです。



それでは


先ほどの


プログラムをかきかえてみます。





元のプログラムは  

↓ ↓ ↓

#include <stdio.h>

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;

/*ここの部分で

struct PlayerStatusDataの構造体宣言struct PlayerStatusDataを行うと同時に

構造体名を struct PlayerStatusDataからPlayerStatusDataに変更しました。

そして

クエスト終了時刻を格納するために

変数宣言

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

を追加しました。*/


int main(void){


PlayerStatusData player1StatusData;

/* player1のステータスデータを管理するために

player1StatusDataの構造体変数宣言をおこないました。

*/


player1StatusData.HP=10;

player1StatusData.MP=8;

player1StatusData.AP=22;

player1StatusData.TP=18;

player1StatusData.cleartimequest1=150;

player1StatusData.cleartimequest2=7800;

player1StatusData.cleartimequest3=123800;

/* player1のステータスデータを

player1StatusDataのメンバ変数に代入しました。*/


printf("player1\n");

printf ("%d\n", player1StatusData.HP);

printf ("%d\n", player1StatusData.MP);

printf ("%d\n", player1StatusData.AP);

printf ("%d\n", player1StatusData.TP);

printf ("%d\n", player1StatusData.cleartimequest1);

printf ("%d\n", player1StatusData.cleartimequest2);

printf ("%d\n", player1StatusData.cleartimequest3);


/* player1のステータスデータを表示しました。*/


return 0;

}

コンパイル結果

10

8

22

18

150

7800

123800


は書き換えられて



次のプログラムのように変化します。

👇  👇

#include <stdio.h>


typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;


/*ここの部分で

struct PlayerStatusDataの構造体宣言struct PlayerStatusDataを行うと同時に

構造体名を struct PlayerStatusData からPlayerStatusDataに変更しました。

そして

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;を


構造体変数宣言

Allcleartimequest Allcleartimequest1;

にかきかえました。

構造体Allcleartimequestと

その構造体変数Allcleartimequest1で表しました*/


int main(void){


PlayerStatusData player1StatusData;

/* player1のステータスデータを管理するために

player1StatusDataの構造体変数宣言をおこないました。

*/


player1StatusData.HP=10;

player1StatusData.MP=8;

player1StatusData.AP=22;

player1StatusData.TP=18;

player1StatusData. Allcleartimequest1.cleartimequest1=150;

player1StatusData. Allcleartimequest1.cleartimequest2=7800;

player1StatusData. Allcleartimequest1.cleartimequest3=123800;

/*ここから大分長いコメント文になります

👇

player1のステータスデータを


構造体変数player1StatusDataのメンバ変数

player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData. Allcleartimequest1.cleartimequest1

player1StatusData. Allcleartimequest1.cleartimequest2

player1StatusData. Allcleartimequest1.cleartimequest3

に代入し初期化しました。


構造体変数Allcleartimequest1を


構造体変数player1StatusDataのメンバ変数として


格納することにより


player1のクエストクリア時間の数値データを


player1StatusDataのメンバ変数である


player1StatusData.cleartimequest1

player1StatusData.cleartimequest2

player1StatusData.cleartimequest3に


player1StatusData.cleartimequest1=150;

player1StatusData.cleartimequest2=7800;

player1StatusData.cleartimequest3=123800;


と代入していた方法から


player1のクエストクリア時間の数値データを


構造体変数 player1StatusDataのメンバ変数である

構造体変数Allcleartimequest1のメンバ変数となった


Allcleartimequest1.cleartimequest1

Allcleartimequest1.cleartimequest2

Allcleartimequest1.cleartimequest3


に代入する方法である


player1StatusData.Allcleartimequest1.cleartimequest1=150;

player1StatusData.Allcleartimequest1.cleartimequest2=7800;

player1StatusData.Allcleartimequest1.cleartimequest3=123800;


に変化しています


このとき.(ドット演算子)が2回もちいられていますね


コメント文 終わり*/


printf("player1\n");

printf ("%d\n", player1StatusData.HP);

printf ("%d\n", player1StatusData.MP);

printf ("%d\n", player1StatusData.AP);

printf ("%d\n", player1StatusData.TP);

printf ("%d\n", player1StatusData.Allcleartimequest1.cleartimequest1);

printf ("%d\n", player1StatusData.Allcleartimequest1.cleartimequest2);

printf ("%d\n", player1StatusData.Allcleartimequest1.cleartimequest3);


/* player1のステータスデータをprintf出力表示しました。*/


return 0;

}

コンパイル結果

10

8

22

18

150

7800

123800


アレサ「

以上で

Allcleartimequest1.cleartimequest1

Allcleartimequest1.cleartimequest2

Allcleartimequest1.cleartimequest3

をメンバ変数にもつ


構造体変数Allcleartimequest1を


構造体変数player1StatusDataのメンバ変数に加えた場合


構造体変数player1StatusDataのメンバ変数となった


構造体変数Allcleartimequest1に


数値データを格納するときの方法の説明について


終了します。」


ソーラー 「アレサ、ありがとう~


player1StatusData.Allcleartimequest1.cleartimequest1


のように.(ドット演算子)が2つかわれるんだね。」


アレサ「ソーラーさん、 手伝ってくれてありがとうですの。」


ソーラー 「構造体、構造体宣言、構造体変数の区別がつかないで


まざってしまいそうだったね。」


アレサ「でも ソーラーさん、随分たのしそうでしたの。」


ソーラー「正直 ここの説明は燃えたね。


なんか めちゃ やる気がでちゃったよ」


アレサ 「ふふ ソーラーさんも成長されているんですね。」


ソーラー「もっちろん さらに進んでいこう アレサ」


アレサ 「はいっです」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます