タイトル | : Re: ZeroMemoryによる構造体配列の初期化について |
記事No | : 15061 |
投稿日 | : 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
|