構造体
構造体とは
構造体とは、沢山の変数をまとめて使えるようにしたものです。
沢山の変数を一度に宣言する配列がありましたが、それの親戚のようなものです。
配列が、全て同じ大きさの変数なのに対し、構造体は、大きさがそれぞれ違い、それぞれに名前を付けられます。
配列
1バイト | 1バイト | 1バイト | 1バイト | 1バイト | 1バイト |
構造体
1バイト | 4バイト | 2バイト | 4バイト | 1バイト | 2バイト |
構造体の定義は以下のようにします。
実際のプログラムです。
#console
#include<vcrt71.sbp>
'DQ構造体を作る。
Type DQ
LV As Long
HP As Long
MP As Long
NAM[32] As Byte
End Type
'構造体を宣言する
Dim tolo As DQ
'構造体のメンバ変数にデータを入れる
tolo.LV=3
tolo.HP=333
tolo.MP=0
strcpy(tolo.NAM , "勇者とろ")
'構造体データを呼び出す
printf(Ex"LV : %d\nHP : %d\nMP : %d\n名前 : %s\n" ,_
tolo.LV , tolo.HP , tolo.MP , tolo.NAM)
'ここで一言。長い文は_(アンダーバー)で2行に分けて書く事ができます。
とりあえず、これで構造体を作って、呼び出して、データを出し入れできるようになったと思います。
構造体のメンバ変数を.(ドット)でつなぐだけで、普通の変数と同じように扱うことができます。
tolo.LVはtoloのLVというように、"."を"の"で置き換えると分かりやすいと思います。
関数に渡す
構造体を関数に渡す時はアドレス(ポインタ)を使って渡します。
関数の引数をByRefにすればすみます。
上のDQ構造体を関数に渡してみましょう。ほとんど一緒です。
#console
#include<vcrt71.sbp>
Type DQ
LV As Long
HP As Long
MP As Long
NAM[32] As Byte
End Type
'構造体を宣言する
Dim tolo As DQ
'構造体のメンバ変数にデータを入れる
tolo.LV=3
tolo.HP=333
tolo.MP=0
strcpy(tolo.NAM , "勇者とろ")
PrintST(tolo)'関数に渡す
'構造体データをプリントする関数
Sub PrintST(ByRef dqs As DQ)
printf(Ex"LV : %d\nHP : %d\nMP : %d\n名前 : %s\n" ,_
dqs.LV , dqs.HP , dqs.MP , dqs.NAM)
End Sub
関数はByRefにしないとコンパイラに怒られます。それだけです。
結果ははじめのプログラムと同じになるはずです。
構造体ポインタを使うこともできます。
詳しくはやりません。こんな書き方もあるんだと知っていれば問題ないです。
むしろ知らなくても当面は困ることは無いと重います。
#console
#include<vcrt71.sbp>
Type DQ
LV As Long
HP As Long
MP As Long
NAM[32] As Byte
End Type
'構造体を宣言する
Dim tolo As DQ
'構造体のメンバ変数にデータを入れる
tolo.LV=3
tolo.HP=333
tolo.MP=0
strcpy(tolo.NAM , "勇者とろ")
PrintST(VarPtr(tolo))'関数にポインタ渡す
'構造体ポインタをプリントする関数
Sub PrintST(dqs As *DQ)
printf(Ex"LV : %d\nHP : %d\nMP : %d\n名前 : %s\n" ,_
dqs->LV , dqs->HP , dqs->MP , dqs->NAM)
End Sub
PrintST関数がdqs As *DQになっている点に注意してください。
構造体ポインタの変数にアクセスするときは、->を使います。
今回の内容で、覚えてほしいのは、構造体の作り方よりも使い方です。
構造体のメンバにアクセスするにはは.を使うこと、万が一ポインタだったら->を使います。
Windowsプログラムでは沢山の構造体が出てきます。どうしても構造体を使わなければなりません。
なので、構造体のメンバアクセスだけは、理解してください。