2014-02-21 3 views
2

Что я doign неправильно с помощью следующего кодаTStringList CustomSort в FreePascal

function CompareFloat(List: TStringList; Index1, Index2: Integer): Integer; 

и я называю это так:

var 
    SL :TstringList; 

SL.CustomSort(CompareFloat); 
//SL.CustomSort(@CompareFloat); // Tried this one also 

Первый вызов функции 'SL.CustomSort (CompareFloat)' подмоткой эта ошибка из компилятора «Ошибка: неправильное количество параметров, указанных для вызова« CompareFloat »

Второй вызов функции« SL.CustomSort (@CompareFloat) »извлекает эту ошибку из компилятора. Ошибка: Onl y класса можно ссылаться на ссылки на класс

ответ

2

SL.CustomSort(CompareFloat); работает, если вы добавите директиву {$mode delphi} куда-то в начало устройства.

Однако SL.CustomSort(@CompareFloat); должен работать нормально. Убедитесь, что сообщение об ошибке не вызвано чем-то другим.

Пример:

program Project1; 

//{$mode delphi} 

uses 
    Classes, 
    SysUtils; 

function CompareFloat(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrToInt(List[Index1]) - StrToInt(List[Index2]); 
end; 

var 
    SL: TStringList; 
begin 
    SL := TStringList.Create; 
    try 
    SL.Add('3'); 
    SL.Add('2'); 
    SL.Add('1'); 
    SL.CustomSort(@CompareFloat); 
    //SL.CustomSort(CompareFloat); 
    Writeln(SL[0], SL[1], SL[2]); 
    Readln; 
    finally 
    SL.Free; 
    end; 
end. 
+0

ОК спасибо это работает для StringList, созданного с нуля в противном случае, как вы указали недостаток где-то еще в коде. Что именно означает с индексом1 и индексом2 в этой функции обратного вызова, index1 = текущее местоположение итератора и индекс2 после местоположения итератора ??? –

+0

CustomSort использует алгоритм QuickSort. Поэтому каждый раз, когда сортировка должна сравнивать два элемента, она будет вызывать функцию CompareFloat, и она будет вызываться несколько раз в процессе сортировки. Index1 и Index2 - это просто индексы элементов, которые нужно сравнить. –

Смежные вопросы