構造体配列をメンバーに持つ構造体を初期化するには?

解決


まつい  2004-06-02 14:56:50  No: 83717  IP: [192.*.*.*]

Private Structure S1'int_A をメンバーに持つ構造体を定義
    Dim int_A As Integer
End Structure

Private Structure S2構造体配列 udt_S1() をメンバーに持つ構造体を定義
    Dim udt_S1() As S1
End Structure

'--------------------------------------------------
'①代入
'--------------------------------------------------
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim udt_Dummy(10) As S1'構造体配列を宣言
    Dim udt_S2 As S2’構造体を宣言

    udt_S2.udt_S1 = udt_Dummy’構造体に構造体配列を登録

    Debug.WriteLine("udt_Dummy(0).int_A = " & udt_Dummy(0).int_A)’結果は 1
    Debug.WriteLine("udt_S2.udt_S1(0).int_A = " & udt_S2.udt_S1(0).int_A)'結果は 1

End Sub

'--------------------------------------------------
'②初期化
'--------------------------------------------------
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim udt_Dummy(10) As S11'構造体配列を宣言
    Dim udt_S2 As S2’構造体を宣言

    udt_S2.udt_S1 = udt_Dummy’構造体に構造体配列を登録

    udt_Dummy(0).int_A = 1
   
    ReDim udt_Dummy(0)'初期化
    
    Debug.WriteLine("udt_Dummy(0).int_A = " & udt_Dummy(0).int_A)'結果は 0
    Debug.WriteLine("udt_S2.udt_S1(0).int_A = " & udt_S2.udt_S1(0).int_A)'結果は 1

End Sub

構造体に構造体配列を登録するときに、構造体配列のアドレスがメンバーになるのなら、
①の様に実体の構造体配列を初期化すると、構造体のメンバーの構造体配列も初期化されると思うのですが?
どなたかご存知の方よろしくお願いします。

編集 削除
まつい  2004-06-02 14:59:10  No: 83718  IP: [192.*.*.*]

タイトルがおかしいですね。
×構造体配列をメンバーに持つ構造体を初期化するには?
○構造体のメンバーの構造体配列を初期化するには?
スマソ。

編集 削除
まつい  2004-06-02 15:07:06  No: 83719  IP: [192.*.*.*]

度々スンマセン。①代入で
udt_S2.udt_S1 = udt_Dummy’構造体に構造体配列を登録
の後に
udt_Dummy(0).int_A = 1
が抜けてます。

編集 削除
nanashi  2004-06-02 15:47:03  No: 83720  IP: [192.*.*.*]

勘でレスしてます。

ReDimのヘルプを見ると、
『動的配列変数に対するメモリ領域の再割り当てを行います。』
と書いてあります。
再割り当てしたらudt_Dummyは別のアドレスになるんじゃないでしょうか?

編集 削除
まつい  2004-06-02 16:21:29  No: 83721  IP: [192.*.*.*]

即レスどうもです。

Array.Clear(udt_Dummy, 0, udt_Dummy.Length)

なら目的を達成することが出来ます。

ReDim udt_Dummy(0)
ReDim udt_S2.udt_S1(0)

とすると、Array.Clear と同じ効果が得られます。

ReDim udt_Dummy(0)
udt_S2.udt_S1 = udt_Dummy←再登録

とすると、Array.Clear と同じ効果が得られます。

ReDimによってudt_Dummyが別アドレスになってたんですね。
ありがとうございました!

編集 削除