- - PR -
VB2005で構造体2次元配列に1次元配列をコピーする方法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-11-18 23:03
VB2005を使用して現在構造体の2次元配列のデータに
1次元配列のデータをcopymemory関数を使ってコピーさせています。 その結果コピーが終わった後の構造体配列が2次元から1次元に変わって しまいます。 Imports System.Runtime.InteropServices Public Module MdlTest ***構造体宣言*** Public Structure A Public aaa As Short End Structure Public Structure B <VBFixedArray(2,2) , MarshalAs(UnmanagedType.ByValArray, sizeconst:=4)>_ Public sAAA(,) As A public Sub initialize() ReDim sAAA(1,1) End Sub End Structure ***CopyMemory用API関数定義*** Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As MdlTest.B , ByRef Source As Short, ByVal Length As Integer) End Module Public Class Form1 'ボタン1クリック時処理 Private Sub Button1_Click(ByVal sender As System.Object, Byval e As ... ***構造体実体宣言*** Dim sBBB As New B sBBB.initialize() ***配列宣言*** Dim Buf(3) As Short For i As Integer = 0 To 3 Buf(i) = i + 1 Next CopyMemory (sBBB, Buf(0), 4 * 2) End Sub End Class ここでsBBBの内容は(2,2)の配列だったのですが、 CopyMemory関数を実行した後はなぜかsBBBの配列が(3)に なってしまいます。 どのようにしたら2次元配列のままコピーができるのでしょうか。。。 | ||||
|
投稿日時: 2006-11-18 23:09
タイトルと質問が一致してなくね? 何がやりたいん? | ||||
|
投稿日時: 2006-11-19 00:19
言葉足らずですみません。
結局sBBBという構造体にデータコピーした後に、 その2次元配列データを後々読み込みや書き込みを別の場所で行いたいときに、 For文などで回してコピーするときにエラーになってしまいます。 例えば・・・ CopyMemory(sBBB , Buf(3) , 4 * 2) For i As Integer = 0 to 1 For j As Integer = 0 to 1 sBBB.sAAA(i,j) = i + j Next Next このときにはすでにsAAAがsAAA(1,1)ではなく、sAAA(3)と なってしまい、エラーになってしまいます。 この回避方法がわかりません。。。 | ||||
|
投稿日時: 2006-11-19 00:20
コードを間違えました。。。
CopyMemory(sBBB , Buf(0) , 4 * 2) For i As Integer = 0 to 1 For j As Integer = 0 to 1 sBBB.sAAA(i,j) = i + j Next Next | ||||
|
投稿日時: 2006-11-19 00:43
マーシャリングの際に一次元に配置されるのは仕様です。
諦めて下さい。 ループ回すのにエラーが出て困るってだけなら、ループの上限を定数ではなく GetLength で取得した配列長にすれば良いでしょう。 // どうせ多次元配列なんて使いにくいしー。 | ||||
|
投稿日時: 2006-11-19 10:17
仕様であれば仕方ないのですね。
ちょっとやり方を工夫してやってみます。 ありがとうございました。 |
1