Pedro Lopez-Cabanillas wrote:
Hi,
The attached program compiles and works fine under Kylix 3, and also compiles under fpc 1.9, but bombs with this message:
An unhandled exception occurred at 0x0807F0B5 :
EAccessViolation : Access violation
0x0807F0B5
It happens on TObjectList.Sort when the argument is a local nested function. It works well when the argument is a global function.
Regards,
Pedro
------------------------------------------------------------------------ program test6; {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} uses Contnrs; type TestClass = class private key: Integer; public constructor Create(keyValue: Integer); function getKey: Integer; end; constructor TestClass.Create(keyValue: Integer); begin key := keyValue; end; function TestClass.getKey: Integer; begin Result := key; end; var list: TObjectList; procedure Populate; begin list := TObjectList.Create; list.add(TestClass.Create(10)); list.add(TestClass.Create(5)); list.add(TestClass.Create(25)); list.add(TestClass.Create(15)); end; procedure SortAndPrint; function TestCompare(ptr1, ptr2: pointer): Integer; var int1, int2: Integer; begin int1 := TestClass(ptr1).getKey; int2 := TestClass(ptr2).getKey; if int1 = int2 then Result := 0 else if int1 < int2 then Result := -1 else Result := 1; end; var i: Integer; begin list.Sort(@TestCompare); for i := 0 to list.Count-1 do begin WriteLn('Item ', i, ', key = ', TestClass(list.Items[i]).getKey); end; end; begin Populate; SortAndPrint; end.
This is bad coding imho and works in Delphi only "by accident" because Delphi uses register calling conventions. Or are I'am wrong and sort expects a local procedure?
AFAIK it is illegal in D5 to use a local procedure for TList.Sort. Don't know if it is still the case in later versions (I haven't tried it and don't expect it) In D1 (or earlier ?) it was legal to do this
Marc
_______________________________________________ fpc-devel maillist - [EMAIL PROTECTED] http://lists.freepascal.org/mailman/listinfo/fpc-devel