2010-12-16 9 views
0

私のコード(.Net Framework 3.5)でこれは本当に奇妙な問題があります。List(Of T)宣言と.addの奇妙な問題

Dim MyList As New List(Of Integer) 

MyList.Add(3) 

MyList.Add(5) 

MyList.Add(9) 

MyList.Add(17) 

をそして、私は置けば

Dim MyList As New List(Of Integer) 

後rigthを「壊す」と「マイリスト」しばらくの上にマウスを置く:だから、通常のVB.NETプログラムでは、私はこのような何かをするだろうコードが一時停止しています。カウント= 0です。しかし、私はちょうどそのようにリストを作成し、(私はそれを壊すとき)取得するサブを持っている: "カウント=プロパティの評価に失敗しました"。

私のリストにはデータを格納するのに十分なスペースがないようです...すべてを試してみるために私が使用する完全なコードは次のとおりです(ちなみにコード自体は意味をなさない私のプロジェクト)。それで私は "奇妙な"振る舞いを作り出すことができ、誰でもこれをテストすることができます。ここで(ごめんコードブロックのボタンが機能していない)コードは次のとおりです。私がしたすべては

Structure lPossibilitiesOutputStruct 

    Dim Pinion As GearOutputStruct 

    Dim Gear As GearOutputStruct 

    Dim Forces As ForcesStruct 

    Dim CenterDistance As Double 

    Dim Pitch As Double 

    Dim lStagePossibilities As List(Of lPossibilitiesOutputStruct) 

End Structure 

Structure GearOutputStruct 

    Dim TeethNbr As Integer 

    Dim RPM As Double 

    Dim FaceWidth As Double 

    Dim OutsideDiameter As Double 

    Dim Addendum As Double 

    Dim WholeDepth As Double 

    Dim OperatingPitchDiameter As Double 

    Dim OverPinData As OverPinOutputStruct 

    Dim SpanData As SpanOutputStruct 

    Dim AllowableBendingPower As Double 

    Dim AllowablePittingPower As Double 

End Structure 

Structure OverPinOutputStruct 

    Dim PinDiameter As Double 

    Dim OverpinMeasurement As Double 

End Structure 

Structure SpanOutputStruct 

    Dim TeethNbr As Integer 

    Dim SpanMeasurement As Double 

End Structure 

Structure ForcesStruct 

    Dim GearSetAxialForce As Double 

    Dim GearSetRadialForce As Double 

    Dim GearSetTangentialForce As Double 

End Structure 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    Dim lStagePossibilities As New List(Of lPossibilitiesOutputStruct) 

    Dim MyList As New List(Of Integer) 

    MyList.Add(3) 

    MyList.Add(5) 

    MyList.Add(9) 

    MyList.Add(17) 

    lStagePossibilities = lGeneratePossibilities(Nothing, Nothing, 3, 1) 

End Sub 

Private Function lGeneratePossibilities(ByVal ActualStage As lPossibilitiesOutputStruct, ByVal CSL As List(Of Integer), ByVal MaxStage As Integer, ByVal CumulatedRatio As Double) As List(Of lPossibilitiesOutputStruct) 

    Return Nothing 

End Function 

形で新しいプロジェクトを作成し、そのコードを作成しました。プロジェクトには他に何もありません。私は "ターゲットCPU"と一緒に遊んで、それはすべてです...

コンパイルオプションを使用してx86 CPUを使用し、 "lStagePossibilities = ..."にブレークを入れると、 "Count = MyList上にマウスを置くと、プロパティの評価に失敗しました。 x64 CPUでそれを実行すると、すべて正常に動作しています...( "Count = 4")。私がx86 CPUに戻ったら、私はエラーを返す。さらに悪いことに、lPossabilitiesOutPutStruct構造体宣言の "Dim Pinion as GearOutputStruct"や "Dim Gear as GearOutputStruct"や "Dim Forces as ForcesStruct"という行をコメントすると、すべてがx86 CPUで正常に動作します。

リストの最大サイズの種類に関連していますか?

ありがとうございました!

ジャン

+0

なぜStructuresを使用していますか?正当な理由がない限り、.Netのクラスを優先します。 –

答えて

2

私はあなたがクラスにStrucuresの一部を変更した場合、問題が消えます賭けます。これはVisual Studioのよく知られたバグで、Structuresが大きくなり、多くのローカルメモリを割り当てようとすると、デバッガで問題が発生することがあります。いくつかの構造には他の構造が含まれており、メモリが足りなくなります。私はx64で構造体のサイズは、パッキングのために大きくなっています。他の人があまりにも知っているだけので、いくつかのMSDNブログ

を引用する

。この問題は、コード内に大きな構造体があることも原因でした。私はそれをクラスに変換し、オブジェクトの上にホバーする変数の値を読み取ることができました。それはいくつかの関数とクラスで機能しましたが、大きな構造体が含まれていたエラーメッセージにエラーがありました。 "コードが最適化されているためガベージコレクションが不可能な場所でスレッドが停止しています。そしてそれは変化を起こしたときに消え去った。それが解決を助け、確認することを願っています。

明確にするには、大きすぎるもの。私の構造は(むしろ)持っていた...

  • 55パブリック変数
  • 6つのパラメータIは、構造体であると信じ
  • 2つのパブリック関数(それらの一つは小さく、いずれかのコードの大きい、約200株であった)

とコンストラクタ簡単で密接なデータと機能の小さな容器として使用することを意図しており、私はこれがあまりにも遠くになっていることに同意するでしょう。それはもちろん、小さなものから始まり、必要性が急上昇しました。今では、まとまったデータと機能がそこに含まれているクラスに入っているので、私は夜に眠ることができます。 =)

私はそれをクラスに変換するのに5分を要しました。簡単に。

+0

も参照:http://blogs.msdn.com/b/rmbyers/archive/2008/08/16/func_2d00_eval-can-fail-while-stopped-in-a-non_2d00_optimized-managed-method-that-pushes- 256以上の引数バイト - .aspx - 正確な*同じ問題ではありませんが、非常に似ています –

+0

ありがとうございました!!!それは今完璧に動作します!構造を使うのではなく、将来私はクラスを使用します! – Jean