[fpc-devel]Nested function as argument for TList.Sort

Marc Weustink marc at dommelstein.net
Thu Nov 27 09:27:39 CET 2003


At 08:54 27-11-2003, Florian Klaempfl wrote:
>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






More information about the fpc-devel mailing list