構造体の構造体宣言にメンバ変数として変数の他に構造体変数を加えてみます
アレサ「さきほどは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のメンバ変数に
player1の
HP
MP
AP
TP
と
クエストクリア時間
cleartimequest1
cleartimequest2
cleartimequest3
の
データ
10
8
22
18
150
7800
123800
を
メモリに格納することができます。
このとき
構造体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
cleartimequest2 7800
cleartimequest3 123800
を
構造体変数player1StatusDataのメンバ変数である
player1StatusData.Allcleartimequest1のメンバ変数
player1StatusData.Allcleartimequest1.cleartimequest1
player1StatusData.Allcleartimequest1.cleartimequest2
player1StatusData.Allcleartimequest1.cleartimequest3
に格納していきます。
構造体変数player1StatusDataのメンバ変数である
player1StatusData.Allcleartimequest1に.を付けた
player1StatusData.Allcleartimequest1.cleartimequest1
player1StatusData.Allcleartimequest1.cleartimequest2
player1StatusData.Allcleartimequest1.cleartimequest3
が
構造体変数player1StatusDataのメンバ変数である
player1StatusData.Allcleartimequest1のメンバ変数
となります
そして
player1StatusData.Allcleartimequest1.cleartimequest1 = 150;
player1StatusData.Allcleartimequest1.cleartimequest2 = 7800;
player1StatusData.Allcleartimequest1.cleartimequest3 = 123800;
のようにデータを格納します。
このように
構造体変数player1StatusDataのメンバ変数である構造体変数player1StatusData.Allcleartimequest1を経由して
typedef struct Allcleartimequest
{
int cleartimequest1;
int cleartimequest2;
int cleartimequest3;
}Allcleartimequest;
のメンバ変数
cleartimequest1
cleartimequest2
cleartimequest3
にデータを格納しているというわけです。
構造体変数Allcleartimequest1のメンバ変数は
Allcleartimequest1.cleartimequest1
Allcleartimequest1.cleartimequest2
Allcleartimequest1.cleartimequest3
となっており
さらに
構造体変数player1StatusDataのメンバ変数は
構造体変数player1StatusData.Allcleartimequest1となっているというわけです。
(ドット).演算子を用いて
player1StatusData.Allcleartimequest1.cleartimequest1
player1StatusData.Allcleartimequest1.cleartimequest2
player1StatusData.Allcleartimequest1.cleartimequest3 ;
と表記することにより
typedef struct Allcleartimequest
{
int cleartimequest1;
int cleartimequest2;
int cleartimequest3;
}Allcleartimequest;
のメンバ変数
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;
}
コンパイル結果
player1
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のメンバ変数となった
player1StatusData.Allcleartimequest1.cleartimequest1
player1StatusData.Allcleartimequest1.cleartimequest2
player1StatusData.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;
}
コンパイル結果
player1
10
8
22
18
150
7800
123800
アレサ「
以上で
Allcleartimequest1.cleartimequest1
Allcleartimequest1.cleartimequest2
Allcleartimequest1.cleartimequest3
をメンバ変数にもつ
構造体変数Allcleartimequest1を
構造体変数player1StatusDataのメンバ変数に加えた場合
構造体変数player1StatusDataのメンバ変数となった
構造体変数Allcleartimequest1のメンバ変数に
数値データを格納するときの方法の説明について
終了します。」
ソーラー 「アレサ、ありがとう~
player1StatusData.Allcleartimequest1.cleartimequest1
のように.(ドット演算子)が2つかわれるんだね。」
アレサ「ソーラーさん、 手伝ってくれてありがとうですの。」
ソーラー 「構造体、構造体宣言、構造体変数の区別がつかないで
まざってしまいそうだったね。」
アレサ「でも ソーラーさん、随分たのしそうでしたの。」
ソーラー「正直 ここの説明は燃えたね。
なんか めちゃ やる気がでちゃったよ」
アレサ 「ふふ ソーラーさんも成長されているんですね。」
ソーラー「もっちろん さらに進んでいこう アレサ」
アレサ 「はいっです」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます