tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル多次元配列構造体の値代入
記事No7289
投稿日: 2008/04/10(Thu) 10:31
投稿者Y開発者
多次元配列構造体で、値を代入すると他の次元の変数値まで、変わってしまいます。
構造体の定義、変数の定義などの仕方に問題があるのでしょうか?
御存じの方がいらっしゃいましたら、ご教授頂けないでしょうか。
宜しくおねがいします。

【環境】
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

[ツリー表示へ]
タイトルRe: 多次元配列構造体の値代入
記事No7291
投稿日: 2008/04/10(Thu) 10:54
投稿者YuO
>         wAnswer = wA(0, 0).wKM_45 ' wAnswer = 100
>         wAnswer = wA(0, 1).wKM_2  ' wAnswer = 100 代入してないのに、値が変わる

どうやってこの値を調べましたか?
System.Diagnostics.Debug.WriteLineを使って調べたところ,最後の代入で0になっていましたが。

[ツリー表示へ]
タイトルRe^2: 多次元配列構造体の値代入
記事No7292
投稿日: 2008/04/10(Thu) 11:15
投稿者Y開発者
YuOさん 返信ありがとうございます。

wA(0, 1).wKM_2 = 0 になっていますか!?

ソース上で、ブレイクポイントを
 wAnswer = wA(0, 1).wKM_2  ' wAnswer = 100 代入してないのに、値が変わる
の下行に付け wAnswer の値をみました。

System.Diagnostics.Debug.WriteLineを使って調べみます。

[ツリー表示へ]
タイトルRe^3: 多次元配列構造体の値代入
記事No7294
投稿日: 2008/04/10(Thu) 11:27
投稿者Y開発者
やはり、System.Diagnostics.Debug.WriteLineを使っても
最後のwAnswerは、100になってます。開発環境なんでしょうか?

[ツリー表示へ]
タイトルRe^4: 多次元配列構造体の値代入
記事No7296
投稿日: 2008/04/10(Thu) 13:21
投稿者るしぇ
> 開発環境なんでしょうか?
違うでしょう。いくらなんでも値型でしかも別メンバの値が
同じ参照になることは考えられません。一番考えられるのが
ブレークポイントを確認行そのものに置いているために
変数に値が代入される前に確認しているということでは。

ブレークポイントを確認コードの次の行に置いて確認しては?

[ツリー表示へ]
タイトルRe^5: 多次元配列構造体の値代入
記事No7299
投稿日: 2008/04/10(Thu) 14:08
投稿者Y開発者
新規プロジェクトで、下記のモジュールのみ追加し実行しても、
イミディエイト ウィンドウには、
0
100
と表示されます。ちなみに他の開発者のPCで、実行しても同じ結果でした。

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

[ツリー表示へ]
タイトルRe^6: 多次元配列構造体の値代入
記事No7300
投稿日: 2008/04/10(Thu) 14:28
投稿者るしぇ
Express Edition で再現したかも?
調査中。。。


wKM_6 wKM_7 を削除して
    <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, Pack:=1)> _
    Public Structure wGData
とすればまともになるっぽい。。。かも?

[ツリー表示へ]
タイトルRe^6: 多次元配列構造体の値代入
記事No7301
投稿日: 2008/04/10(Thu) 14:35
投稿者YuO
> 新規プロジェクトで、下記のモジュールのみ追加し実行しても、
> イミディエイト ウィンドウには、
> 0
> 100
> と表示されます。ちなみに他の開発者のPCで、実行しても同じ結果でした。

イミディエイト ウィンドウへの出力はどうやっていますか?

System.Diagnostics.Debug.WriteLineは「出力」タブの,
出力元「デバッグ」へ出力されます。

Y開発者さんのコードをModule名以外をCopy & Pasteして実行してみましたが,
0
0
と出力されています。

環境:
・Windows Vista Ultimate (SP1)
・Visual Studio 2005 Professional / Version 8.0.50727.867 (vsvista.050727-8600)
・Microsoft .NET Framework 2.0.50727 SP1

[ツリー表示へ]
タイトルRe^6: 多次元配列構造体の値代入
記事No7302
投稿日: 2008/04/10(Thu) 15:03
投稿者Y開発者
YuO さん 度々返信ありがとうございます。

プロジェクト上のタブ - デバッグ - ウィンドウ - イミディエイトで、
表示させてデバッグすると、イミディエイト ウィンドウに
0
100
と表示されます。

もしかして、SP1があたってないから?

【環境】Visual Studio 2005 Standard Edition / Version 8.0.50727.42
    Microsoft .NET Framework 2.0.50727

[ツリー表示へ]
タイトルRe^7: 多次元配列構造体の値代入
記事No7309
投稿日: 2008/04/10(Thu) 22:28
投稿者Azulean
広く情報を求めたいのであればそれを断った上で、それぞれのページにリンクするべきですよ。
解決策が1カ所で提示されていても、アドバイスしようと調べる人の無駄な手間が増えますし、同じような悩みを抱えた人が解決策にたどり着きにくくするだけです。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44338&forum=36
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=3149481&SiteID=7

なお、利用上の注意に以下の記述があります。
> 少なくても、最初に書き込んだ掲示板で2〜3日は回答を待ちましょう。
> 又、書き込んだすべての掲示板に、返信・解決報告は必ずして下さい。

[ツリー表示へ]
タイトル解決: 多次元配列構造体の値代入
記事No7310
投稿日: 2008/04/11(Fri) 09:47
投稿者Y開発者
Azulean さん 返信ありがとうございます。

Azulean さん,この投稿を見ていただいた方、申し訳ありません。
掲示板に投稿するのが初めてでして、基本的なマナーがわかりませんでした。
以後、気を付けたいと思います。また、投稿することが度々あるとおもいますが、
よろしくお願いします。

おかげさまで、.NET Framework2.0 SP1 をあてることで解決しました。
みなさん、ありがとうございました。

[ツリー表示へ]