type
P_MissInfo = ^MissInfo;
MissInfo = record
Missqty:integer;
MissRate : Double;
end;function CompareNames(Item1, Item2: Pointer): Integer;
begin
if (P_MissInfo(Item1).MissRate>P_MissInfo(Item2).MissRate) OR
((P_MissInfo(Item1).MissRate=P_MissInfo(Item2).MissRate) AND
(P_MissInfo(Item1).Missqty>P_MissInfo(Item2).Missqty ) ) then
Result:=1
else Result:=-1
end;procedure TForm1.MissRate();
var
list:tlist;
PMissInfo:P_MissInfo;
begin
list:=tlist.create;
......
New(PMissInfo)
PMissInfo.Missqty:=
PMissInfo.MissRate:=
list.Add(PMissInfo);
......
// 在Add N个PMissInfo后
......
list.Sort(@CompareNames);
// 使用Sort排序,目的是按P_MissInfo结构体中MissRate排序,如果MissRate一样再按Missqty排序
end;问题:执行list.Sort(@CompareNames)中报错reised exception class Estackoverflow with message 'stack overflow',prcess stopped.
请大虾指点是哪里出了错?
P_MissInfo = ^MissInfo;
MissInfo = record
Missqty:integer;
MissRate : Double;
end;function CompareNames(Item1, Item2: Pointer): Integer;
begin
if (P_MissInfo(Item1).MissRate>P_MissInfo(Item2).MissRate) OR
((P_MissInfo(Item1).MissRate=P_MissInfo(Item2).MissRate) AND
(P_MissInfo(Item1).Missqty>P_MissInfo(Item2).Missqty ) ) then
Result:=1
else Result:=-1
end;procedure TForm1.MissRate();
var
list:tlist;
PMissInfo:P_MissInfo;
begin
list:=tlist.create;
......
New(PMissInfo)
PMissInfo.Missqty:=
PMissInfo.MissRate:=
list.Add(PMissInfo);
......
// 在Add N个PMissInfo后
......
list.Sort(@CompareNames);
// 使用Sort排序,目的是按P_MissInfo结构体中MissRate排序,如果MissRate一样再按Missqty排序
end;问题:执行list.Sort(@CompareNames)中报错reised exception class Estackoverflow with message 'stack overflow',prcess stopped.
请大虾指点是哪里出了错?
不需要@
还是报stack overflow
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;type
P_MissInfo = ^MissInfo;
MissInfo = record
Missqty: integer;
MissRate: Double;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function CompareNames(Item1, Item2: Pointer): Integer;
begin
result := Integer(CompareValue(P_MissInfo(Item1).MissRate, P_MissInfo(Item2).MissRate));
end;procedure TForm1.Button1Click(Sender: TObject);
var
list: Tlist;
PMissInfo: P_MissInfo;
begin
list := Tlist.create;
New(PMissInfo);
PMissInfo.Missqty:= 10;
PMissInfo.MissRate:= 12.56;
list.Add(PMissInfo); New(PMissInfo);
PMissInfo.Missqty:= 12;
PMissInfo.MissRate:= 12.8;
list.Add(PMissInfo); New(PMissInfo);
PMissInfo.Missqty:= 9;
PMissInfo.MissRate:= 11.56;
list.Add(PMissInfo); list.Sort(@CompareNames);
Showmessage(IntToStr(list.Count));
showmessage(FloatToStr(P_MissInfo(list.Items[0]).MissRate));
showmessage(FloatToStr(P_MissInfo(list.Items[1]).MissRate));
showmessage(FloatToStr(P_MissInfo(list.Items[2]).MissRate));
end;end.
sort目的是按P_MissInfo结构体中MissRate排序,如果MissRate一样再按Missqty排序
将function CompareNames改成:
function CompareNames(Item1, Item2: Pointer): Integer;
var
i: Integer;
begin
i := Integer(CompareValue(P_MissInfo(Item2).MissRate, P_MissInfo(Item1).MissRate));
if i<>0 then
Result:=i
else
Result:= Integer(CompareValue(P_MissInfo(Item2).Missqty, P_MissInfo(Item1).Missqty));
end;