トップ回答者
多次元配列構造体の値の代入について

質問
-
多次元配列構造体で、値を代入すると他の次元の変数値まで、変わってしまいます。
構造体の定義、変数の定義などの仕方に問題があるのでしょうか?
御存じの方がいらっしゃいましたら、ご教授頂けないでしょうか。
宜しくおねがいします。
【環境】
Windows XP Pro
Microsoft Visual Basic 2005
.NET Framework2.0.50727
Public Structure wGData
Dim wKM_1 As Double
Dim wKM_2 As Double
Dim wKM_3 As Double
Dim wKM_4 As Short
Dim wKM_5 As Integer
Dim wKM_6 As String
Dim wKM_7 As String
Dim wKM_8 As Integer
Dim wKM_9 As Integer
Dim wKM_10 As Integer
Dim wKM_11 As Short
Dim wKM_12 As Single
Dim wKM_13 As Single
Dim wKM_14 As Single
Dim wKM_15 As Byte
Dim wKM_16 As Integer
Dim wKM_17 As Integer
Dim wKM_18 As Byte
Dim wKM_19 As Byte
Dim wKM_20 As Byte
Dim wKM_21 As Byte
Dim wKM_22 As Double
Dim wKM_23 As Double
Dim wKM_24 As Double
Dim wKM_25 As Double
Dim wKM_26 As Double
Dim wKM_27 As Double
Dim wKM_28 As Double
Dim wKM_29 As Double
Dim wKM_30 As Double
Dim wKM_31 As Double
Dim wKM_32 As Double
Dim wKM_33 As Double
Dim wKM_34 As Double
Dim wKM_35 As Double
Dim wKM_36 As Double
Dim wKM_37 As Double
Dim wKM_38 As Double
Dim wKM_39 As Double
Dim wKM_40 As Double
Dim wKM_41 As Double
Dim wKM_42 As Double
Dim wKM_43 As Double
Dim wKM_44 As Double
Dim wKM_45 As Double
Dim wKM_46 As Double
Dim wKM_47 As Double
Dim wKM_48 As Double
Dim wKM_49 As Double
Dim wKM_50 As Double
Dim wKM_51 As Double
Dim wKM_52 As Double
Dim wKM_53 As Double
Dim wKM_54 As Double
Dim wKM_55 As Double
Dim wKM_56 As Double
Dim wKM_57 As Double
Dim wKM_58 As Double
Dim wKM_59 As Double
Dim wKM_60 As Double
Dim wKM_61 As Double
Dim wKM_62 As Double
Dim wKM_63 As Double
Dim wKM_64 As Double
Dim wKM_65 As Double
Dim wKM_66 As Double
Dim wKM_67 As Double
Dim wKM_68 As Double
End Structure
Public Sub Test_Sub()
Dim wAnswer As Double
Dim wA(,) As wGData
ReDim wA(0, 1)
wAnswer = wA(0, 1).wKM_2 ' wAnswer = 0
wA(0, 0).wKM_45 = 100
wAnswer = wA(0, 0).wKM_45 ' wAnswer = 100
wAnswer = wA(0, 1).wKM_2 ' wAnswer = 100 代入してないのに、値が変わる
End Sub
回答
-
Y開発者 さんからの引用
再現しましたか!! 他のところでも質問しているんですが、みなさん再現しないようで。サイズが256バイト以上の構造体でおかしくなるようです。
一個となりに書き込んじゃいます。
[code]
Module MainModule
<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Public Structure wGData
<System.Runtime.InteropServices.FieldOffset(0)> _
Dim wKM_1 As Double
<System.Runtime.InteropServices.FieldOffset(255)> _
Dim wKM_2 As Byte
End StructureSub Main()
Dim wA(,) As wGData
ReDim wA(0, 2)
wA(0, 0).wKM_1 = 100
System.Diagnostics.Trace.WriteLine(wA(0, 0).wKM_1) '100
System.Diagnostics.Trace.WriteLine(wA(0, 1).wKM_1) 'なぜか100。正しくは0。
End SubEnd Module
[/code]
ILはきちんと吐いてるようですし、C#でも同じなので、CLRのバグですね。
SP1を充ててないのではないでしょうか?
SP1を充てたら正常に動くと思います。
-
広く情報を求めたいのであればそれを断った上で、それぞれのページにリンクするべきですよ。
解決策が1カ所で提示されていても、アドバイスしようと調べる人の無駄な手間が増えますし、同じような悩みを抱えた人が解決策にたどり着きにくくするだけです。http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44338&forum=36&4
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=7289&page=0
Y開発者 さんからの引用
今、VS 2005 SP1 のダウンロード中で、1時間ぐらいかかりそうです。今、話に出ているのは.NET Framework 2.0 SP1のことで、VS 2005のSP1じゃ差は出ませんよ、基本的には。
職場のVS2005SP1+.NET 2.0(SPなし)では再現し、VS2005SP1+.NET2.0SP1では再現しません。
.NET2.0SP1で修正されたと考えるのが素直でしょう。
参考:VistaSP1、.NET Framework 3.5、VS2008のそれぞれには.NET 2.0SP1相当が含まれる。
すべての返信
-
Y 開発者さん、こんにちは。
提示して頂いたミニマム コードでこのような現象が起きることは 100% ありえません。
そこでお聞きしたいのですが、どのように確認して wA(0, 1).wKM_2 および wAnswer の値を確認しましたか?私はデバッグ実行後に Test_Sub メソッド内でブレークして、そこからステップ実行して確認したのではと予想します。
つまり、wA(0, 0).wKM_45 から代入した wAnswer の値と勘違いしているのではないかと考えます。
ステップ実行中に反転している行は、「これから実行しますよ」 行であり、「今実行した行」 ではありません。
wAnswer = wA(0, 1).wKM_2 の行が実行される以前では、wAnswer が 100.0 なのは自明です。
実行後に wAnswer は 0.0 になるでしょう。 -
新規プロジェクトで、下記のモジュールのみ追加し実行しても、
イミディエイト ウィンドウには、
0
100
と表示されます。ちなみに他の開発者のPCで、実行しても同じ結果でした。
じゃんぬねっと さんの開発環境は、
Microsoft Visual Basic 2005
.NET Framework2.0.50727
ですか?
Module MainModule
Public Structure wGData
Dim wKM_1 As Double
Dim wKM_2 As Double
Dim wKM_3 As Double
Dim wKM_4 As Short
Dim wKM_5 As Integer
Dim wKM_6 As String
Dim wKM_7 As String
Dim wKM_8 As Integer
Dim wKM_9 As Integer
Dim wKM_10 As Integer
Dim wKM_11 As Short
Dim wKM_12 As Single
Dim wKM_13 As Single
Dim wKM_14 As Single
Dim wKM_15 As Byte
Dim wKM_16 As Integer
Dim wKM_17 As Integer
Dim wKM_18 As Byte
Dim wKM_19 As Byte
Dim wKM_20 As Byte
Dim wKM_21 As Byte
Dim wKM_22 As Double
Dim wKM_23 As Double
Dim wKM_24 As Double
Dim wKM_25 As Double
Dim wKM_26 As Double
Dim wKM_27 As Double
Dim wKM_28 As Double
Dim wKM_29 As Double
Dim wKM_30 As Double
Dim wKM_31 As Double
Dim wKM_32 As Double
Dim wKM_33 As Double
Dim wKM_34 As Double
Dim wKM_35 As Double
Dim wKM_36 As Double
Dim wKM_37 As Double
Dim wKM_38 As Double
Dim wKM_39 As Double
Dim wKM_40 As Double
Dim wKM_41 As Double
Dim wKM_42 As Double
Dim wKM_43 As Double
Dim wKM_44 As Double
Dim wKM_45 As Double
Dim wKM_46 As Double
Dim wKM_47 As Double
Dim wKM_48 As Double
Dim wKM_49 As Double
Dim wKM_50 As Double
Dim wKM_51 As Double
Dim wKM_52 As Double
Dim wKM_53 As Double
Dim wKM_54 As Double
Dim wKM_55 As Double
Dim wKM_56 As Double
Dim wKM_57 As Double
Dim wKM_58 As Double
Dim wKM_59 As Double
Dim wKM_60 As Double
Dim wKM_61 As Double
Dim wKM_62 As Double
Dim wKM_63 As Double
Dim wKM_64 As Double
Dim wKM_65 As Double
Dim wKM_66 As Double
Dim wKM_67 As Double
Dim wKM_68 As Double
End Structure
Sub Main()
Call Test_Sub()
End Sub
Public Sub Test_Sub()
Dim wA(,) As wGData
ReDim wA(0, 1)
System.Diagnostics.Debug.WriteLine(wA(0, 1).wKM_2)
wA(0, 0).wKM_45 = 100
System.Diagnostics.Debug.WriteLine(wA(0, 1).wKM_2) '代入してないのに、値が変わる
End Sub
End Module -
Y開発者 さんからの引用
再現しましたか!! 他のところでも質問しているんですが、みなさん再現しないようで。サイズが256バイト以上の構造体でおかしくなるようです。
一個となりに書き込んじゃいます。
[code]
Module MainModule
<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Public Structure wGData
<System.Runtime.InteropServices.FieldOffset(0)> _
Dim wKM_1 As Double
<System.Runtime.InteropServices.FieldOffset(255)> _
Dim wKM_2 As Byte
End StructureSub Main()
Dim wA(,) As wGData
ReDim wA(0, 2)
wA(0, 0).wKM_1 = 100
System.Diagnostics.Trace.WriteLine(wA(0, 0).wKM_1) '100
System.Diagnostics.Trace.WriteLine(wA(0, 1).wKM_1) 'なぜか100。正しくは0。
End SubEnd Module
[/code]
ILはきちんと吐いてるようですし、C#でも同じなので、CLRのバグですね。
SP1を充ててないのではないでしょうか?
SP1を充てたら正常に動くと思います。
-
広く情報を求めたいのであればそれを断った上で、それぞれのページにリンクするべきですよ。
解決策が1カ所で提示されていても、アドバイスしようと調べる人の無駄な手間が増えますし、同じような悩みを抱えた人が解決策にたどり着きにくくするだけです。http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44338&forum=36&4
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=7289&page=0
Y開発者 さんからの引用
今、VS 2005 SP1 のダウンロード中で、1時間ぐらいかかりそうです。今、話に出ているのは.NET Framework 2.0 SP1のことで、VS 2005のSP1じゃ差は出ませんよ、基本的には。
職場のVS2005SP1+.NET 2.0(SPなし)では再現し、VS2005SP1+.NET2.0SP1では再現しません。
.NET2.0SP1で修正されたと考えるのが素直でしょう。
参考:VistaSP1、.NET Framework 3.5、VS2008のそれぞれには.NET 2.0SP1相当が含まれる。