4

私はジェネリックコレクションの経験がありません。TDictionaryをソートする必要があります。

type TSearchResult = TPair<Integer,double>;

var
   target_results : TDictionary<Integer, double>;
   session_search_results : array[0..max_searches] of TArray<TSearchResult>;

このコードを使用して並べ替えています

   session_search_results[session_search_id]:= target_results.ToArray;
   TArray.Sort<TSearchResult>(session_search_results[session_search_id],
                    TComparer<TSearchResult>.Construct(
                              function(const L, R: TSearchResult): Integer
                              begin
                                 Result := Round(R.Value - L.Value);
                              end
                    ));

これでアクセス違反が発生するのはなぜですか?私は何が間違っているのですか?

補体:

配列を反復処理すると

 for i:= 0 to Length(session_search_results[session_search_id])-1 do
      MyDebug(IntToStr(session_search_results[session_search_id][i].Key)+' = value = '
            + FloatToStr(session_search_results[session_search_id][i].Value));

次の出力が得られます:

Debug Output: ==>CoreSearchText: array length=8<== Process TestApp.exe (2536)
Debug Output: ==>100007 = value = 19,515<== Process TestApp.exe (2536)
Debug Output: ==>100003 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100005 = value = 12<== Process TestApp.exe (2536)
Debug Output: ==>100008 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100002 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100004 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100009 = value = 40,515<== Process TestApp.exe (2536)
Debug Output: ==>100001 = value = 15<== Process TestApp.exe (2536)

並べ替えが適用されると、アクセス違反によりアプリケーションがクラッシュします。アレイは問題ないようです。理由は何ですか?ありがとう!

4

1 に答える 1

6

これは、再宣言された汎用レコードと最適化がオンになっているXE(XE2にも存在)のcodegenバグのようです。

このプログラムはバグを再現します:

program Project1;

{$APPTYPE CONSOLE}
{$O+}

uses
  Generics.Collections,
  Generics.Defaults,
  SysUtils;

type
  TSearchResult = TPair<Integer, Integer>;

function Compare(const L, R: TSearchResult): Integer;
begin
  Result := R.Value - L.Value;
end;

var
  values: TArray<TSearchResult>;
begin
  try
    SetLength(values, 3);
    TArray.Sort<TSearchResult>(values, TComparer<TSearchResult>.Construct(Compare));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

QC#106391として報告しました。

考えられる解決策は、TArray<T>.Sortの呼び出しを含むユニットに{$O-}を追加することです。

于 2012-06-13T20:11:53.190 に答える