TList.Sort Compilerfehler

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

TList.Sort Compilerfehler

Beitrag von aldicek »

Ich habe eine Klasse, die eine TList enthält. Für diese Liste möchte ich eigene Sortierfolgen definieren.
Beim Compilieren gibt es Compilerfehler an der Stelle, an der ich die Sortierung aufrufe:

Code: Alles auswählen

unit1.pas(151,30) Error: Incompatible type for arg no. 1: Got "<procedure variable type of function(Pointer,Pointer):LongInt of object;Register>", expected "<procedure variable type of function(Pointer,Pointer):LongInt;Register>"
Ich habe schon viel herumgeforscht, aber so richtig bin ich dem Geheimnis um diese Callback-Geschichte noch nicht auf den Grund gekommen. Was mache ich falsch?
(Ich werkel mit Lazarus 0.9.30, FPC 2.4.2. auf einem WinXP SP3)
Hier der Code:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes,
  SysUtils,
  FileUtil,
  Forms,
  Controls,
  Graphics,
  Dialogs,
  StdCtrls,
  Grids,
  LCLType;
 
type
  TCompareDesc = function (Item1, Item2: Pointer): integer of object;
 
  { TsdkCell }
 
  TsdkCell = class
    Value,
    PreviousValue: byte;
    Candidates: array[1..9]of byte;
    CandList: TList;	{ Diese Liste will ich u.a. auf- und abwärts sortieren können. Sie enthält Pointer auf die einzelnen Einträge in Candidates. }
  private
    { private declarations }
    //FCompareDesc: TCompareDesc;
  public
    { public declarations }
    constructor Create;
    destructor Destroy; override;
	...
     procedure SetCandidate(aCandidate: byte);
    function CompareDesc(Item1, Item2: Pointer): integer;
  end;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ...
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{ TsdkCell }
 
constructor TsdkCell.Create;
begin
  Value:=0;
  PreviousValue:=Value;
  CandList:= TList.Create;
  InitCandidates;
  //CompareDesc:=FCompareDesc;
end;
 
procedure TsdkCell.SetCandidate(aCandidate: byte);
var
  Index: integer = -1;
begin
  if aCandidate>0 then
  begin
    Candidates[aCandidate]:=aCandidate;
    Find(aCandidate, Index);
    if Index>=0 then
    begin
      CandList.Add(@Candidates[aCandidate]);
    end;
    CandList.Sort(@CompareDesc); { Hier bleibt der Compiler mit obiger Fehlermeldung hängen. }
  end;
end;
 
function TsdkCell.CompareDesc(Item1, Item2: Pointer): integer;
begin
  Result:=Integer(Item2^)-Integer(Item1^);
end;
Ich habe einige Zeilen auskommentiert, die ich einem Beispiel entnommen hatte, denn egal was auch immer ich davon compilieren ließ, immer brach der Compiler ab. (Wenn auch mit unterschiedlichen Meldungen.)
Bin dankbar für jeden Tipp!

Aldi

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: TList.Sort Compilerfehler

Beitrag von carli »

Lass das "of object" weg

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TList.Sort Compilerfehler

Beitrag von mse »

Code: Alles auswählen

type
  TListSortCompare = function (Item1, Item2: Pointer): Integer;
 
  TList = class(TObject)
...
    procedure Sort(Compare: TListSortCompare);
also

Code: Alles auswählen

function CompareDesc(Item1, Item2: Pointer): integer;
begin
  Result:=Integer(Item2^)-Integer(Item1^);
end;
da nicht

Code: Alles auswählen

type
  TListSortCompare = function (Item1, Item2: Pointer): Integer of object;
Martin

aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

Re: TList.Sort Compilerfehler

Beitrag von aldicek »

Hallo

und danke für die schnellen Antworten!
Habe es so gemacht und es funktioniert.

Nochmals vielen Dank
Aldi

Antworten