![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В Delphi можно сравнивать записи одного типа?
Artem © (2012-01-19 18:57:00)В Delphi можно сравнивать записи одного типа?
=
<>
oxffff (2012-01-21 12:34:00) [1]Да, нет это копипаст.
Это место неоднократно переписывалось при введении сначала penalty по upcast, потом классу выражений, потом downcast.
А если намек на то, что можно написать более составное условие для
LeftPriority := DestExpression.GetPriority;
RightPriority := LocalPriority;
AdditionalPenalty := LocalAdditionalPenalty;
lValidatorResult.Left := DestExpression;
lValidatorResult.Right := RightValueExpr;
то на это есть свои причины.
KilkennyCat (2012-01-21 12:17:00) [2]
> oxffff © (21.01.12 12:05) [15]
надеюсь, ты не копи-пасте делал, а так, по памяти сюда вогнал :)
oxffff (2012-01-21 12:11:00) [3]Этот пример из кода который пытается разрешить неоднозначность при присваивании в зависимости от приоритетов и дополнительных действий
oxffff (2012-01-21 12:05:00) [4]Из моего кода
TExpressionValueAbstractPenalty=record
private
PenaltyCountP,PenaltyCountN: DWORD;
public
constructor create(PenaltyCountP,PenaltyCountN: DWORD);
class operator Add(a:TExpressionValueAbstractPenalty;b:TExpressionValueAbstractPenalty):TExpres sionValueAbstractPenalty;
class operator Equal(a:TExpressionValueAbstractPenalty;b:TExpressionValueAbstractPenalty):boole an;
class operator LessThan(a:TExpressionValueAbstractPenalty;b:TExpressionValueAbstractPenalty):bo olean;
class operator GreaterThan(a:TExpressionValueAbstractPenalty;b:TExpressionValueAbstractPenalty) :boolean;
end;
TExpressionValueAbstractPriority = record
private
PriorityClass:TExpressionValueAbstractPriorityClass;
Penalty:TExpressionValueAbstractPenalty;
public
constructor create(PriorityClass: TExpressionValueAbstractPriorityClass;
PenaltyCountP: DWORD;
PenaltyCountN: DWORD);
class operator Equal(a:TExpressionValueAbstractPriority;b:TExpressionValueAbstractPriority):boo lean;
class operator LessThan(a:TExpressionValueAbstractPriority;b:TExpressionValueAbstractPriority): boolean;
class operator GreaterThan(a:TExpressionValueAbstractPriority;b:TExpressionValueAbstractPriorit y):boolean;
end;
Пример использования
....
if ((DestExpression.GetPriority > LeftPriority) and
(LocalPriority < RightPriority)) or
((DestExpression.GetPriority < LeftPriority) and
(LocalPriority > RightPriority)) then
begin
raise Exception.create('Ошибка! Critical error 49949 :)');
end;
if (DestExpression.GetPriority > LeftPriority) then
begin
LeftPriority := DestExpression.GetPriority;
RightPriority := LocalPriority;
AdditionalPenalty := LocalAdditionalPenalty;
lValidatorResult.Left := DestExpression;
lValidatorResult.Right := RightValueExpr;
end
else if (DestExpression.GetPriority = LeftPriority) then
if LocalPriority > RightPriority then
begin
LeftPriority := DestExpression.GetPriority;
RightPriority := LocalPriority;
AdditionalPenalty := LocalAdditionalPenalty;
lValidatorResult.Left := DestExpression;
lValidatorResult.Right := RightValueExpr;
end
else if LocalPriority = RightPriority then
if LocalAdditionalPenalty < AdditionalPenalty then
begin
LeftPriority := DestExpression.GetPriority;
RightPriority := LocalPriority;
AdditionalPenalty := LocalAdditionalPenalty;
lValidatorResult.Left := DestExpression;
lValidatorResult.Right := RightValueExpr;
end
else if LocalAdditionalPenalty = AdditionalPenalty then
begin
lValidatorResult.Left := nil;
lValidatorResult.Right := nil;
end;
................
Anatoly Podgoretsky (2012-01-21 11:11:00) [5]Нельзя снять выровненые записи, они полны мусора
Германн (2012-01-21 02:43:00) [6]
> KilkennyCat © (21.01.12 01:38) [12]
>
>
> > jack128_ (20.01.12 12:52) [8]
> > Дмитрий Белькевич (20.01.12 14:22) [9]
>
> понятно. с арифметикой особенно убедило.
Меня тоже пример с арифметикой убедил. Но...
KilkennyCat (2012-01-21 01:38:00) [7]
> jack128_ (20.01.12 12:52) [8]
> Дмитрий Белькевич (20.01.12 14:22) [9]
понятно. с арифметикой особенно убедило.
хотя, мне кажется, чаще всего записи -винегрет сплошной, хрен их на меньше больше целиком сравнишь. точнее, хрен поймешь результат. или мне везет просто на такие записи.
Inovet (2012-01-20 14:39:00) [8]> [10] Самуилыч (20.01.12 14:31)
> Так в чем же польза?
В том что пишется один шаблон
if a < b
а компилятор в зависимости от типа подставит что надо именно для этого типа.
Самуилыч (2012-01-20 14:31:00) [9]Мне другое непонятно. Чтобы перегрузить оператор, надо писать код. Но точно такой же код можно написать и в функции, а потом вызывать ее где угодно. Так в чем же польза?
Дмитрий Белькевич (2012-01-20 14:22:00) [10]
> ну на равенство я бы еще понял смысл, удалить дубликаты.
> .. а меньше-больше - если такой смысл есть, то с головой
> явно беда.
Да ладно... Мало ли какие данные там хранятся и что с ними нужно делать. Хотя бы для сортировки записей тем же квиксортом.
jack128_ (2012-01-20 12:52:00) [11]
> ну на равенство я бы еще понял смысл, удалить дубликаты.
> .. а меньше-больше - если такой смысл есть, то с головой
> явно беда.
на например чтоб длинную арифметику реализовать. и соответсвтенно, чтоб мождно было на больше меньше две записи "TBigInt" сравнивать.
Inovet (2012-01-20 12:17:00) [12]> [5] KilkennyCat © (20.01.12 04:21)
> а меньше-больше - если такой смысл есть, то с головой явно беда.
Ну почему нет, если такая опереция определена над множеством.
> [6] megavoid © (20.01.12 12:06)
> так можно и строку на запись умножить :)
Аналогично.
megavoid (2012-01-20 12:06:00) [13]> Operator_Overloading
так можно и строку на запись умножить :)
KilkennyCat (2012-01-20 04:21:00) [14]ну на равенство я бы еще понял смысл, удалить дубликаты... а меньше-больше - если такой смысл есть, то с головой явно беда.
oxffff (2012-01-19 21:52:00) [15]Можно. Можно и разных.
Read
http://docwiki.embarcadero.com/RADStudio/en/Operator_Overloading_%28Delphi%29
Anatoly Podgoretsky (2012-01-19 21:00:00) [16]И выравнивание отключено :-)
Самуилыч (2012-01-19 19:44:00) [17]CompareMem, если в записях нет указателей (в том числе объектов, динамических массивов, длинных строк и т.п.).
Dimka Maslov (2012-01-19 19:20:00) [18]нет