Как передать массив любого типа объекта в процедуру сортировки

#arrays #sorting #delphi

#массивы #сортировка #delphi

Вопрос:

У меня есть эффективная процедура сортировки для массивов, которую я хотел бы применить к более общему классу массивов. Приведенный ниже код демонстрирует идею:

 type
  TtestRec     = class
    index      : integer;
    rndm       : integer;
    constructor  create(indx,aRandomInt : integer);
  end;

  TtestRecArray= array of TtestRec;

var
  base         : TtestRecArray;

constructor TtestRec.create(indx,aRandomInt : integer);
begin
  index:=indx;
  rndm:=aRandomInt;
end;

function makeArray(N,m : integer) : TtestRecArray;
var k : integer;
begin
  setLength(result,N);
  for k:=0 to N-1 do result[k]:=TtestRec.Create(k,random(m));
end;

procedure sortTestRecs(var A : array of TtestRec; compare : TlistSortCompare);
begin
 // may change order of elements but not modify elements itself
end;

procedure sortGeneral(var A : array of Tobject; compare : TlistSortCompare);
begin
 // should be same as above but applicable to other types of records
end;

function compareRecs(left,right : pointer) : integer;
begin
  result:=TtestRec(left).rndm-TtestRec(right).rndm;
  if result=0
     then result:=TtestRec(left).index-TtestRec(right).index
end;

begin
  base:=makeArray(100,100);
  sortTestRecs(base,compareRecs);
  sortGeneral(base,compareRecs);   // Incompatible types: 'array of TObject' and 'TtestRecArray'
end.
 

Аргументом to sortGeneral может быть любой массив с элементами, производными от Tobject . В конце концов, это всего лишь массив указателей. Функциональная значимость содержится в compareRecs функции. Но определение sortGeneral не позволяет вызывать его ни с чем, кроме array of Tobject . Как я могу заставить это работать (без обобщений)?

Комментарии:

1. Посмотрите на процедуры и функции перегрузки . Вам также придется отправлять различные функции сравнения.

2. Немного не по теме, но все же важно: вы не должны использовать вычитание для сравнения целых чисел.

3. Что касается самого вопроса, мне не совсем понятно, чего вы пытаетесь достичь. Функция сортировки должна учитывать структуру данных. Вы можете использовать нетипизированный указатель или TObject массивы везде и небезопасные приведения (если вы знаете, что делаете). Если вы хотите добавить некоторую безопасность типов на более высоком уровне, вы все равно можете использовать приведение массива, о котором я упоминал в своем комментарии к вашему предыдущему вопросу. sortGeneral(TArray<TObject>(base),compareRecs); . Вы не сообщили нам, какую версию Delphi вы используете, но если вы используете предгенерическую, вам нужно 2 dcl a type TObjArray = array of TObject .

4. @Andreas ДА! большое вам спасибо и извините, что я не понял ваших предыдущих ответов. procedure sortGeneral(var A:TArray<TObject>,compare:TlistSortCompare) будет принимать массивы любого типа объекта.

5. Почему вы не хотите использовать дженерики? Удаление безопасности типов не ускорит ваш алгоритм сортировки.