Форум: "Начинающим";
Текущий архив: 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