Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.12.10;
Скачать: CL | DM;

Вниз

Применение class function в TList.Sort()   Найти похожие ветки 

 
KSergey ©   (2016-01-08 18:21) [0]

В моём понимании, что регулярная функция, что 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-08 18:25) [1]

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


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


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

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

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


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

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


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


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

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


 
jack128 ©   (2016-01-09 02:12) [5]

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


 
KSergey ©   (2016-01-09 15:13) [6]

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

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


 
Sha ©   (2016-01-09 15:30) [7]

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

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


 
KSergey ©   (2016-01-09 16:30) [8]

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

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


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

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
 );


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

KSergey ©   (09.01.16 16:30) [8]


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


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


 
Sha ©   (2016-01-09 16:55) [11]

Кусок юнита из одного проекта:
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);


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


 
Sha ©   (2016-01-09 17:01) [12]

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

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


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

Sha ©   (09.01.16 17:01) [12]

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


 
Sha ©   (2016-01-09 23:28) [14]

> Игорь Шевченко ©   (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-10 00:08) [15]

Sha ©   (09.01.16 23:28) [14]

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


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

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

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


 
jack128 ©   (2016-01-10 18:03) [17]


> У меня Д5

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


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

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2017.12.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
2-1451479702
Лори
2015-12-30 15:48
2017.12.10
Возможно ли подключиться к SQLServer на WinAPI? Или на чём-то


15-1468252307
Putnik
2016-07-11 18:51
2017.12.10
Использование ПК как lpt-принтер


2-1452377949
gedevan
2016-01-10 01:19
2017.12.10
RecordSet как пройтись циклом 2 раза?


2-1452266475
KSergey
2016-01-08 18:21
2017.12.10
Применение class function в TList.Sort()