構造体について?


SHIBU  2002-10-01 21:15:28  No: 105082

構造体を勉強したのですが、いまいちどのようなプログラムを組む時に、有効なのかが分かりません。
できればこうゆう時に使ったというのを教えて下さい!!


あんちゃん  2002-10-01 21:52:20  No: 105083

目的ある変数を管理したい時でしょうか。

A.項目1    B.項目1
A.項目2    B.項目2
A.項目3    B.項目3
A.項目4    B.項目4

比較にも使えますし、何より目的別に管理する必要がある場合は効果があると思います。

例えば、マウスの機能を管理したい時などは

マウス.↑移動
マウス.↓移動
マウス.→移動
マウス.←移動
マウス.右クリック
マウス.右ダブルクリック
マウス.左クリック
マウス.左ダブルクリック
マウス.右ドラッグ
マウス.左ドラッグ

のように名前をつけておけば管理しやすいのでは?


  2002-10-02 02:12:25  No: 105084

あんちゃんお返事ありがとうございます。
構造体を配列で使いたいのですが使い方がよく分からないので出来れば教えて下さい。


たかみちえ  URL  2002-10-02 02:38:58  No: 105085

構造体というのは、かいただけでは実体が存在しません。
実行時エラーになったときに"ユーザー定義型"と出るとおり、
まだ変数の型を宣言したようなものに過ぎません。
なので、
Dim record As Myrecord
とかいう風にして、宣言しないといけません。
なので、配列にしたいときは、普通の変数宣言と同じようにやります。

  あと、最近気づいたことなんですけど、構造体というのは一つの変数として見られます。
なので、ZeroMemoryなどのAPIなどで、いっぺんに初期化したりできます。
あと、こっちは試したことはありませんけど、
For Eachなどで全要素を参照することもできると思います。


Say  2002-10-02 14:11:59  No: 105086

'使い方がわからない、ということですので例を1つ・・・。

'ゲームを作ろうと思ったとします。
'そのゲームには敵が出てきます。
'敵には、識別番号、名称、x座標、y座標、ヒットポイント、攻撃力、防御力、速度があります。
'これを構造体(ユーザ定義型)で宣言/定義しましょう。

'=========================================================

'まずはユーザ定義型の型宣言/定義

Private Type TekiType
    ID As Long
    Name As String
    x As Long
    y As Long
    hp As Long
    Att As Long
    Def As Long
    sp As Long
End Type

'敵は最大100体でてきますので、配列でユーザ定義型の変数宣言/定義

Dim udtTeki(99) As TekiType

'次に変数の中身を初期化する関数を作ります。

Private Sub TekiInit()
    Dim i As Long
    For i = 0 To 99
        With udtTeki(i)
            .ID = i + 1
            .Name = "スライム" & CStr(.ID) ' 名前はスライム1〜スライム99
            .x = Int(Rnd * 100)
            .y = Int(Rnd * 100)
            .hp = Int(Rnd * 6) + 5 ' ヒットポイントは 5〜10
            .Att = Int(Rnd * 4) + 3 ' 攻撃力は 3〜6
            .Def = Int(Rnd * 3) + 2 ' 防御力は 2〜4
            .sp = Int(Rnd * 2) + 1 ' 速度は 1〜2
        End With
    Next
End Sub

'で、敵にダメージを与える関数は

Private Sub TekiDamage(lngTekiNo As Long, lngDamage As Long)
    Dim strMsg  As String
    With udtTeki(lngTekiNo)
        If .hp = 0 Then
            strMsg = .Name & " はすでに死んでいる"
        Else
            If .hp - lngDamage < 0 Then
                lngDamage = .hp
                .hp = 0
            Else
                .hp = .hp - lngDamage
            End If
            strMsg = .Name & " は " & CStr(lngDamage) & " のダメージを受けた"
            strMsg = strMsg & vbCrLf & .Name & " の体力は " & CStr(.hp) & " になった"
            If .hp = 0 Then
                strMsg = strMsg & vbCrLf & .Name & " は死んだ"
            End If
        End If
        MsgBox strMsg
    End With
End Sub

'でもって、ボタンを押したらスライム11に5のダメージを与えましょう。

Private Sub Command1_Click()
    Call TekiDamage(10, 5)
End Sub

'あとは、Form_Loadで初期化処理を呼べば出来上がり。

Private Sub Form_Load()
    Randomize
    Call TekiInit
End Sub

'=========================================================

'ゲームにはほど遠いですが、Formにボタン1個置いて、
'このレスを丸ごと貼り付ければ、一応動作します。

'ボタンを2回も押せばスライム11を退治できるでしょう。

'ちなみに、今回の例ようにユーザ定義型変数に
'敵の攻撃、敵の防御などの関数を関連付けたほうが都合がいいときは、
'クラス化したほうがすっきりします。

'PS.
'適当に作ってるのであら捜ししないように (^_^;


SHIBU  2002-10-02 20:42:20  No: 105087

固定長の物は配列に入れるにはどうしたらいいのでしょうか


Say  2002-10-02 22:46:47  No: 105088

構造体ではなく配列ですか?
結局何がやりたいのでしょう?
やりたいことがあるのならはっきり書かないと
無駄に時間とトラフィックとサーバリソースを
浪費するだけです。

10バイトのデータを配列にとりたいなら
Dim bytData(10) As Byte
とすればいいでしょう。


Say  2002-10-02 22:47:58  No: 105089

失礼、
VBの場合、
Dim bytData(9) As Byte
ですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加