delphi - "Stack overflow" error with Generic TList.Sort -
i've implemented generics.defaults.tcomparer sorting typed tlist. when calling sort method, throws exception "stack overflow at..."
why stack overflow error occurring?
// declarations torder = record id: integer; orderdate: tdate; end; porder = ^torder; forderlist: tlist<porder>; tcomparer_orderdate = class(tcomparer<porder>) public function compare(const a, b: porder): integer; override; end; function tcomparer_orderdate.compare(const a, b: porder): integer; begin result := 0; if (a^.orderdate> b^.orderdate) result := 1 else result := -1; end; // code inside button onclick event: forderlist := tlist<porder>.create; fcomparer_orderdate := tcomparer_orderdate.create; forderlist.sort(fcomparer_orderdate); // <--- 'stack overflow' error.
your compare function needs return 0 equality. this:
function tcomparer_orderdate.compare(const a, b: porder): integer; begin if (a^.orderdate > b^.orderdate) result := 1 else if (a^.orderdate < b^.orderdate) result := -1 else result := 0; end; end; it's easier use tcomparer<porder>.construct make comparer.
forderlist.sort( tcomparer<porder>.construct( function(const a, b: porder): integer begin if (a^.orderdate > b^.orderdate) result := 1 else if (a^.orderdate < b^.orderdate) result := -1 else result := 0; end; end ) ); or use default date time comparer:
datetimecomparer := tcomparer<tdatetime>.default; forderlist.sort( tcomparer<porder>.construct( function(const a, b: porder): integer begin result := datetimecomparer.compare(a^.orderdate, b^.orderdate); end ) ); i've not compiled of expect there minor errors.
Comments
Post a Comment