我需要一些解决这个问题的建议。我有这个数据结构:
type
QmyArray = array of integer;
PmyArray = record
element: Qmyarray;
value: integer;
end;
TMyArray = array of Pmyarray;
var
myarray: tmyArray;
myvalue: qmyarray;
我正确设置了myarray的所有值,并且myarray.element的所有值都正确排序,这很好。我遇到的问题是当我想在myarray中搜索myvalue并获得价值时。 对于搜索,我使用binarysearch并写:
tarray.BinarySearch(myarray, myvalue, index);
当然它不起作用。因为我明白需要定制比较器所以我写道:
function CompareB(const Left, Right: integer): Integer;
begin
if Left < Right then
Result := -1
else if Left > Right then
Result := 1
else
Result := 0;
end;
function CompareA(const Left, Right: pmyarray): Integer;
var
iIndex: Integer;
begin
Result := CompareB(Left.element[0], Right.element[0]);
for iIndex := 1 to High(Right.element) do
if Result = 0 then
Result := CompareB(Left.element[iIndex], Right.element[iIndex]);
end;
并尝试:
tarray.BinarySearch(myarray, myvalue, index, TComparer<Pmyarray>.Construct(CompareA));
但在这种情况下我收到此错误:
[DCC错误] Project1.dpr(98):E2250没有可以使用这些参数调用的'BinarySearch'的重载版本
我不明白我犯了什么错误。
我该如何解决?
答案 0 :(得分:4)
您只有一个错误,myvalue
变量的类型应为PMyArray
,而不是QmyArray
。下次遇到此类问题时,请尝试使用TArray.BinarySearch
的长版本,以便Code Insight实际显示有意义的类型名称。
当你写:
TArray.BinarySearch(myarray, myvalue, index, iComparer)
编译器需要从参数中猜出数组的类型。如果您错过了myarray
和myvalue
的类型,则编译器无法确定您真正想要的内容,并且代码洞察无法实际显示您想要的内容。但您可以通过使用以下语法告诉它您要操作的数组类型来帮助它:
TArray.BinarySearch<PmyArray>(myarray, myvalue, index, iComparer)
有了这个,编译器知道你打算处理一个PmyArray
数组。代码洞察也知道这一点,并向您展示它所需的确切参数类型。
这有效:
program Project9;
{$APPTYPE CONSOLE}
uses
SysUtils, Generics.Collections, Generics.Defaults;
type
QmyArray = array of Integer;
PmyArray = record
element: QmyArray;
value: Integer;
end;
TMyArray = array of PmyArray;
var myarray: TMyArray;
myvalue: PmyArray;
FoundIndex: Integer;
function CompareB(const Left, Right: integer): Integer;
begin
if Left < Right then
Result := -1
else if Left > Right then
Result := 1
else
Result := 0;
end;
function CompareA(const Left, Right: pmyarray): Integer;
var
iIndex: Integer;
begin
Result := CompareB(Left.element[0], Right.element[0]);
for iIndex := 1 to High(Right.element) do
if Result = 0 then
Result := CompareB(Left.element[iIndex], Right.element[iIndex]);
end;
begin
TArray.BinarySearch<PmyArray>(myarray, myvalue, FoundIndex, TComparer<PmyArray>.Construct(CompareA));
end.