tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: ZeroMemoryによる構造体配列の初期化について
投稿日: 2010/12/02(Thu) 16:32
投稿者魔界の仮面弁士
> (Redimを一度も行っていない場合)と値を入れたあと(たとえばUbound(配列名)の
> 値が120のとき)で、上記Len(構造体名)のサイズが同じままになっています。
静的配列の場合は、ユーザー定義型の一部として確保されますが、
動的配列の場合、その要素はユーザー定義型とは別の場所に確保されており、
ユーザー定義型は、その場所を指し示す4バイトのアドレス値のみを記録しています。


> ZeroMemory関数は構造体配列の初期化に使えますでしょうか。
ユーザー定義型のレイアウトによっては、メモリ上の位置が連続していない場合や、
クリアしてはいけない領域が含まれている可能性があるため、そのような場合には、
全体を一括クリアするのではなく、必要なエリアごとに処理する必要があります。

それらを踏まえたうえで、メモリ上の配置を理解して使う分には OK でしょう。


> Redim 配列名(0) や Erase 配列名 でクリアしたほうがよいでしょうか。
その方が安全でしょうね。なお、Redim 配列名(0) と Erase 配列名 は別の処理です。


> VB6構造体の初期化をWin32APIのZeroMemory関数で行っています。
> 関数の第二引数(構造体の大きさ)にはLen(構造体名)を渡しています。
Len ≠ LenB なユーザー定義型の場合は、パディングに注意が必要です。

VB6 のユーザー定義型は、各メンバーが 32bit の境界を跨がないように配置されます。
Len 関数が返すのは再配置前の値、LenB は再配置後のサイズを返します。

Option Explicit

Private Type a
    p1 As Byte
    v(7) As Integer
    p2 As Byte
End Type

Private Type b
    p1 As Byte
    v() As Integer
    p2 As Byte
End Type

Private Sub Form_Load()
    Dim x As a
    Dim y As b
    
    Debug.Print "静的配列 : a", Len(x), LenB(x)
    Debug.Print "初期化前 : b", Len(y), LenB(y)
    ReDim y.v(7)
    Debug.Print "初期化後 : b", Len(y), LenB(y)
End Sub

------------- 実行結果
静的配列 : a   18    20
初期化前 : b    6    12
初期化後 : b    6    12
-------------
http://support.microsoft.com/kb/137729/ja

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。