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

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

В 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]

нет


Наверх

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