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.
请大虾指点是哪里出了错?

解决方案 »

  1.   

    list.Sort(CompareNames);  
    不需要@
      

  2.   

    这个还真不好判断,TList用的是QuickSort的递归实现,的确要占用一定stack。不过满打满算一次调用也不超过4x bytes的stack开销,就算放满了数据也只能调用30次,最多也就占用1k的stack。delphi默认1m的stack,不该只差这1/1000就stack overflow了吧,况且更不可能有2^30的数据量。所以更可能是你代码的别的什么地方破坏了栈指针,也有一种不太可能的可能性就是某个调用里使用的局部变量空间太大了,接近1M
      

  3.   

    list.Sort(CompareNames);  
    还是报stack overflow
      

  4.   

    unit Unit1;interfaceuses
      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.
      

  5.   

    知道问题了,多谢各位!
    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;