Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.12.10;
Скачать: [xml.tar.bz2];

Вниз

Применение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.001 c
2-1452377949
gedevan
2016-01-10 01:19
2017.12.10
RecordSet как пройтись циклом 2 раза?


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-1452266475
KSergey
2016-01-08 18:21
2017.12.10
Применение class function в TList.Sort()





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский