2009-03-12 23 views
1

私はこのようなコードを持っている:TDictionary - 無効なキー

type 
    TMyDictionary = TDictionary<int, int>; 

var 
    myDict: TMyDictionary; 
    k, v: integer; 

    // code to fill the dictionary 

    for k in myDict.Keys do 
    begin 
    v := myDict.Items[k]; 

    // other stuff 
    end; 

ランダムに私が上でスローされた例外を参照V ':= myDict.Items [k]を;' kは無効であると言います。

誰でもこれを見ましたか?

答えて

1

CodeCentralを見ると、TDictionary、特にfor ... in ...構造をサポートする列挙子に対していくつかのバグが発生しています。

1

// other stuffのセクションにmyDictを変更していますか?

+0

ループ内でmyDictを変更していません。私は最大の価値を見つけるために各辞書を歩いています。 – TheArtTrooper

0

ローカル変数のみを使用してこの問題を1つの方法で再現してください。

2つの異なるスレッドから変数を使用しているか、おそらくmyDictの要素を更新している可能性があります。

私はもっとそれを再現についての私の答えを説明してみましょう:

あなたが別のコンピュータ上で実行され、あなたが取得しているエラーを示すことができる一つの方法を作成する必要があります。例えばので

(質問:私はゼロ例外によって除算を取得しています):あなたがコンピュータでこれを実行する場合

var 
    i : integer; 
begin 
    i := 3; 
    while (i <= 0) do 
    begin 
    Writeln(FloatToStr(20/i)); 
    Dec(i); 
    end; 
end 

、人々はゼロ例外によって除算を取得します。だから問題を再現することができました。できるだけシンプルなスニペットを作成して、問題を一貫して再現してください。

+0

これはあなたが記述しているとおりです。単一の方法。ただ1つのスレッド。私がループ内でやっていることは、最大の「v」を探して、これをローカル変数に格納することです。 – TheArtTrooper

+0

私が意図したことは、それを再現するためのサンプルプロシージャを作成しようとし、他の人がサンプルコードを見ることができるようにここに投稿することでした。 –

+0

ここに完全なループがあります:fcm.Keysのkの do begin try v:= fcm.Items [k]; v> maxの場合、 begin 結果:= k; max:= v; end; を除く。 end; end; – TheArtTrooper

関連する問題