一个关于过程类型的问题:
type
TCompareFunc = function (aData1,aData2:pointer):integer;//定义一个函数类型
//下面定义若干函数,上面定义的函数类型指向下列函数
function CompareNullStr(aData1, aData2:pointer):integer;
function CompareLongint(aData1, aData2 : pointer) : integer;
//函数实现部分
function TDCompareLongint(aData1, aData2 : pointer) : integer;
var
L1 : longint absolute aData1;
L2 : longint absolute aData2;
begin
if (L1 < L2) then
Result := -1
else if (L1 = L2) then
Result := 0
else
Result := 1
end;function TDCompareNullStr(aData1, aData2 : pointer) : integer;
begin
Result := StrComp(PAnsiChar(aData1), PAnsiChar(aData2));
end;
现在问题来了:我要在一个比较例程中把该函数类型作为参数使用,比如:procedure ShakeSort(aList:TList;aFirst,aLast:integer;aCompare:TMyCompareFunc);
var
i,j:integer;
Temp:pointer;
begin
while (aFirst < aLast) do
begin
{完成一趟冒泡排序}
for i:= aLast downto succ(aFirst) do
if (aCompare(aList.List^[i],aList^[i-1])< 0 ) then
begin
Temp:= aList.List^[i];
aList.List^[i]:= aList.List^[i-1];
aList.List^[i-1]:= Temp;
end;
inc(aFirst);
for i:= succ(aFirst) to aLast do
if (aCompare(aList.List^[i],aList.List^[i-1])<0) then//@@
begin
Temp:= aList.List^[i];
aList.List^[i]:= aList.List^[i-1];
aList.List^[i-1]:= Temp;
end;
dec(aLast);
end;
end;
此时,@@ 传入的参数是指针类型,在函数类型调用比较函数的时候怎样确定该调用哪个比较函数?
type
TCompareFunc = function (aData1,aData2:pointer):integer;//定义一个函数类型
//下面定义若干函数,上面定义的函数类型指向下列函数
function CompareNullStr(aData1, aData2:pointer):integer;
function CompareLongint(aData1, aData2 : pointer) : integer;
//函数实现部分
function TDCompareLongint(aData1, aData2 : pointer) : integer;
var
L1 : longint absolute aData1;
L2 : longint absolute aData2;
begin
if (L1 < L2) then
Result := -1
else if (L1 = L2) then
Result := 0
else
Result := 1
end;function TDCompareNullStr(aData1, aData2 : pointer) : integer;
begin
Result := StrComp(PAnsiChar(aData1), PAnsiChar(aData2));
end;
现在问题来了:我要在一个比较例程中把该函数类型作为参数使用,比如:procedure ShakeSort(aList:TList;aFirst,aLast:integer;aCompare:TMyCompareFunc);
var
i,j:integer;
Temp:pointer;
begin
while (aFirst < aLast) do
begin
{完成一趟冒泡排序}
for i:= aLast downto succ(aFirst) do
if (aCompare(aList.List^[i],aList^[i-1])< 0 ) then
begin
Temp:= aList.List^[i];
aList.List^[i]:= aList.List^[i-1];
aList.List^[i-1]:= Temp;
end;
inc(aFirst);
for i:= succ(aFirst) to aLast do
if (aCompare(aList.List^[i],aList.List^[i-1])<0) then//@@
begin
Temp:= aList.List^[i];
aList.List^[i]:= aList.List^[i-1];
aList.List^[i-1]:= Temp;
end;
dec(aLast);
end;
end;
此时,@@ 传入的参数是指针类型,在函数类型调用比较函数的时候怎样确定该调用哪个比较函数?
var
TempFunc1,TempFunc1:TMyCompareFunc;
begin
...
@TempFunc1:=@CompareNullStr;
@TempFunc2:=@CompareLongint;
procedure ShakeSort (aList,aFirst,aLast,TempFunc1,TempFunc2);
....
end;