- PR -

VB2005で構造体2次元配列に1次元配列をコピーする方法

1
投稿者投稿内容
てんさん
会議室デビュー日: 2006/10/14
投稿数: 8
投稿日時: 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次元配列のままコピーができるのでしょうか。。。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-11-18 23:09
引用:

てんさんさんの書き込み (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/10/14
投稿数: 8
投稿日時: 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/10/14
投稿数: 8
投稿日時: 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
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-11-19 00:43
マーシャリングの際に一次元に配置されるのは仕様です。
諦めて下さい。

ループ回すのにエラーが出て困るってだけなら、ループの上限を定数ではなく GetLength で取得した配列長にすれば良いでしょう。

// どうせ多次元配列なんて使いにくいしー。
てんさん
会議室デビュー日: 2006/10/14
投稿数: 8
投稿日時: 2006-11-19 10:17
仕様であれば仕方ないのですね。

ちょっとやり方を工夫してやってみます。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)