Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Применение class function в TList.Sort()


KSergey ©   (2016-01-08 18:21:00) 

В моём понимании, что регулярная функция, что class function (статическая в терминах С++) - это буквально одно и тоже.

Однако, вот в таком коде получаем ошибку компиляции "Incompatible types: regular procedure and method pointer".
Вопрос: почему??

   TStorage = class(TList)
   private
       class function CompareML(p1, p2: Pointer): Integer;
   end;

class function TStorage.CompareML(p1, p2: Pointer): Integer;
begin
   ....
end;

function TMoneyLimitStorage.SomeFunction: Integer;
begin
   Self.Sort(CompareML);
end;


Юрий Зотов   (2016-01-10 19:56:00) [1]

Действительно, в смысле языка Дельфи потихоньку превращается в Джаву.


KSergey   (2016-01-10 18:41:00) [2]

jack128 ©   (10.01.16 18:03) [17]
static методы появились примерно тогда же когда и анонимные методы, дженерики и тд.


Понял, спасибо.


jack128   (2016-01-10 18:03:00) [3]


> У меня Д5

ну, о таких вещах заранее предупреждать надо.
static методы появились примерно тогда же когда и анонимные методы, дженерики и тд.


Sha   (2016-01-10 00:24:00) [4]

> Игорь Шевченко ©   (10.01.16 00:08) [15]
> Но я за последнее время привык к коду, понятному даже бестолковым.

это ж недостижимый идеал :)


Игорь Шевченко   (2016-01-10 00:08:00) [5]

Sha ©   (09.01.16 23:28) [14]

Охотно верю. Но я за последнее время привык к коду, понятному даже бестолковым. А прототипы твоих процедур, мне, увы, непонятны :) Я не сомневаюсь, что они оптимизированы по быстродействию, но - непонятны.


Sha   (2016-01-09 23:28:00) [6]

> Игорь Шевченко ©   (09.01.16 22:12) [13]

Мне тоже.
Обычно для сортировки массива объектов или указателей (RecordSize=0)  или записей (RecordSize>0) хватает такой процедуры:
procedure Sort(var First; Count: integer; RecordSize: integer; const Fields: TSortFields); overload;


или ей эквивалентной процедуры, которая предварительно формирует массив  TSortFields:
procedure Sort(var First; Count: integer; RecordSize: integer; SortOrders: array of TSortOrder;
 DataOffsets, IndirectOffsets: array of integer; CompareFuncs0, CompareFuncs1: array of pointer); overload;


Игорь Шевченко   (2016-01-09 22:12:00) [7]

Sha ©   (09.01.16 17:01) [12]

Мне как раз периодически нужно отсортировать список объектов, а не простых типов, а писать каждый раз нового реализатора IComparer не всегда хочется.


Sha   (2016-01-09 17:01:00) [8]

> Игорь Шевченко ©   (09.01.16 16:52) [9]

Понятно. Но такое разовое-местное использование в моем коде встречается нечасто.
Чаще требуется универсальность по куче полей типа [11].
И к тому же сами поля могут быть или не быть ссылочными.


Sha   (2016-01-09 16:55:00) [9]

Кусок юнита из одного проекта:
const
 SortCompareFunctions: array[TSortOrder] of pointer=
  (@CompareByteAsc,     @CompareByteDesc,
   @CompareWordAsc,     @CompareWordDesc,
   @CompareCardinalAsc, @CompareCardinalDesc,
   @CompareUInt64Asc,   @CompareUInt64Desc,
   @CompareShortIntAsc, @CompareShortIntDesc,
   @CompareSmallIntAsc, @CompareSmallIntDesc,
   @CompareIntegerAsc,  @CompareIntegerDesc,
   @CompareInt64Asc,    @CompareInt64Desc,
   @CompareDoubleAsc,   @CompareDoubleDesc,
   @CompareNoCaseAsc,   @CompareNoCaseDesc,
   @CompareUpCaseAsc,   @CompareUpCaseDesc,
   @CompareStringAsc,   @CompareStringDesc,
   @CompareTextAsc,     @CompareTextDesc,
   nil, nil);


Не совсем представляю, как эквивалент на анонимных функциях был бы более нагляден.


Игорь Шевченко   (2016-01-09 16:53:00) [10]

KSergey ©   (09.01.16 16:30) [8]


> Как правило, потом эта функция еще нужна при бинарном поиске.
>  А иначе зачем сортировать


Есть масса причин для сортировки без бинарного поиска впоследствии :)
Например, отображение.


Игорь Шевченко   (2016-01-09 16:52:00) [11]

Sha ©   (09.01.16 15:30) [7]

Как-то так:

 List.SortList(
   function (Item1, Item2: Pointer): Integer  //Сортировка по убыванию длины
   var
     Foo1, Foo2: TFoo;
   begin
     Foo1 := TFoo(Item1);
     Foo2 := TFoo(Item2);
     if Foo1.Length < Foo2.Length then
       Result := 1
     else if Foo1.Length > Foo2.Length then
       Result := -1
     else
       Result := 0;
   end
 );


KSergey   (2016-01-09 16:30:00) [12]

> Игорь Шевченко ©   (08.01.16 23:47) [4]
> Кстати, одно из мест где очень удобны анонимные функции
> (в соответствующих версиях Delphi) - это функция сравнения,
>  передаваемая в метод сортировки.

Как правило, потом эта функция еще нужна при бинарном поиске. А иначе зачем сортировать )
Я к тому, что анонимными функциями сложно отделаться (на мой взгляд).


Sha   (2016-01-09 15:30:00) [13]

> Игорь Шевченко ©   (08.01.16 23:47) [4]

Игорь, нельзя ли чуть подробнее?


KSergey   (2016-01-09 15:13:00) [14]

> jack128 ©   (09.01.16 02:12) [5]
> А чем топикстартера не устраивает статическая функция? Та
> которая модификатор static объявляется.

Это вы сейчас про дельфи?
Если да - просьба уточнить версию.
У меня Д5


jack128   (2016-01-09 02:12:00) [15]

А чем топикстартера не устраивает статическая функция? Та которая модификатор static объявляется.


Игорь Шевченко   (2016-01-08 23:47:00) [16]

Кстати, одно из мест где очень удобны анонимные функции (в соответствующих версиях Delphi) - это функция сравнения, передаваемая в метод сортировки.


Юрий Зотов   (2016-01-08 19:06:00) [17]

> KSergey ©   (08.01.16 18:46) [2]
> А, на класс, а не на экземпляр


Именно. Физически, это адрес VMT.


KSergey   (2016-01-08 18:46:00) [18]

Зачем классовому методу ссылка на класс??
А, на класс, а не на экземпляр, и тут есть хитрость для дельфи...

Спасибо, до такого не догадался.
Спасибо!


Юрий Зотов   (2016-01-08 18:25:00) [19]

> что регулярная функция, что class function
> (статическая в терминах С++) - это буквально одно и тоже.


Нет. Регулярная функция имеет точно те параметры, что объявлены в ее
сигнатуре. А классовый метод имеет еще один неявный параметр - ссылку на класс.


Наверх

Титульная страница Поиск, карта сайта Написать письмо