0

なぜこの例外が発生するのか誰かに教えてもらえますか?アクセスしようとしているリスト内の要素が存在しないと表示されているために「なぜ」取得しているのかはわかっていますが、コードをステップスルーすると、実際に存在していることがわかりますか?

Game1では、ヘルパークラスの計算メソッドを呼び出します。次に、計算が完了したら、その結果をCalculationHelperクラスのList<>に追加します。このためのコードは次のようになります。

CalculationHelper calcHelperクラスをインスタンス化したGame1クラスで、クラスメソッドの1つを呼び出します。最初に、Game1で、以下に示すfor()ループでcalcHelper.ForceVanishingPointIntersections(...)メソッドを呼び出します。これは問題なく機能し、calcHelper.ForceVanishingPointIntersections(...)メソッドはCalculationHelperクラスのIntersectionPointList <>に値を追加します(以下のメソッドを参照)。

for (int i = 0; i < LineList.Count; i++)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    AddSprite(VanishingPointIntersectionList, calcHelper.GetIntersectionPointListElementAt(i), greenCirlce);
    i++;
}

いくつかの計算を行い、CalculationHelperクラスのIntersectionPointlistに値を追加するには、次のようにします。

List<Vector2> IntersectionPointList = new List<Vector2>();
public void ForceVanishingPointIntersections(Line line1, Line line2)
{
    Vector2 intersectionPoint;
    // Do some calculations

    IntersectionPointList.Add(intersectionPoint);
}

最後に、Game1クラスで、for()ループの2番目のメソッドで、AddSpriteを呼び出してスプライトを作成します。CalculationHelperクラスIntersectionPointListに格納されている値をスプライトの座標として渡したい。この目的のために、CalculationHelperクラスのメソッドを呼び出すcalcHelper.GetIntersectionPointListElementAt(i)を呼び出します(IntersectionPointList <>から指定されたポイント(i)の値を返す必要があります)public Vector2 GetIntersectionPointListElementAt(int index){Vector2 result = this.IntersectionPointList [index]; 結果を返します。for()ループが初めて実行されるとき、これは正常に機能します。計算を行うと、値がリストに保存され、リストからこの値を取得してAddSprite(..)に渡すことができます。ただし、2回目のfor()ループでは、

public Vector2 GetIntersectionPointListElementAt(int index)
{
    Vector2 result = this.IntersectionPointList[index];    // Exception thrown here
    return result;
}

インデックスが範囲外だと言っていますか?しかし、コードをステップスルーすると、IntersectionPointListが更新され、リストに2つの値が含まれていることが示されます。そして、私は2番目の値にアクセスしようとしています。

なぜこれができるのか誰かが知っていますか?私の人生の間、私はどこが間違っているのか理解できません。

さらにコードが必要な場合は、さらに投稿できます。お知らせください。

4

3 に答える 3

4

LineList[]インデックスを使用してアクセスするためi + 1、for-conditionの最後のインデックスを1つ減らす必要があります。(注意してください-1

for (int i = 0; i < LineList.Count - 1; i++) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite( ... );
}

ForceVanishingPointIntersectionsこれはインデックスで呼び出します

(0、1)、(1、2)、(2、3)、...(カウント-2、カウント-1)

のインデックス範囲LineListは。であることに注意してください0 ... Count-1


代わりに、重複しないインデックスが必要な場合は、次のようになります。

(0、1)、(2、3)、(4、5)、...(カウント-2、カウント-1)

次に、ループをに変更します

for (int i = 0; i < LineList.Count - 1; i += 2) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite(
        VanishingPointIntersectionList,
        calcHelper.GetIntersectionPointListElementAt(i / 2),
        greenCirlce);
}

編集クリス・ゲスラーのコメントによると、この2番目のアプローチは正しいものです。

ループの内側を削除しi++ます。これは非常にまれで混乱を招きます。代わりに、i += 2ループヘッダーに置き換えてください。

また、(Chris Gesslerによると)IntersectionPointListアイテムの数は。の半分であることに注意してくださいLineList。したがって、GetIntersectionPointListElementAtで呼び出しますi / 2。なので、 iです。_{0, 2, 4, ... }i / 2{0, 1, 2, ...}


forループを使用すると、最初と3番目のセクションにステートメントのコンマ区切りリストを含めることができます。これを使用して、2つのインデックスを維持できます

for (int i = 0, k = 0; i < LineList.Count - 1; i += 2, k++) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite(
        VanishingPointIntersectionList,
        calcHelper.GetIntersectionPointListElementAt(k),
        greenCirlce);
}
于 2012-04-22T14:47:42.473 に答える
1
for (int i = 0; i < LineList.Count; i++)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    ...

    i++;
}

それを行う代わりに、次のことを行う必要があります。

for (int i = 0; i < LineList.Count; i += 2)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    ...
}

また、LineList.Countが偶数でない場合、たとえば次のようになります。3. 0から始まり、0と1を使用します。次に2にジャンプし、2と3を使用します。3つはありません!3つだけ数えなさい!0から2!

それは、引数が範囲外の例外になる場合です。これを回避するには、Count%2 == 0かどうかを確認するか、余分なものがある場合はスキップしてもかまわない場合は、LineList.Count-1まで進むことができます。

于 2012-04-22T14:41:51.680 に答える
1

1つのスプライトごとに2つの行を追加しているようです。インデックスは整列しません。LineListに10個のアイテムがある場合、IntersectionPointListアイテムは5個しかないため、9個のインデックスを渡すと失敗します。

LineListコレクションをに変更List<Tuple<string,string>>して、各スプライトと並ぶアイテムごとに2行になるようにする必要があります。これにより、ラインとスプライトの間に1対1の関係が作成されます。

常にインデックス(i / 2)を渡すことができると思います。これは、2行ごとに正しいスプライトである必要があります。

于 2012-04-22T14:46:12.347 に答える