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

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

Сравнение записей [D7]


Страницы:   1 2

Wistler ©   (2005-07-24 11:02:00) 

Доброго времени суток. Аж стыдно за такой вопрос, но заклинило.

Есть 2 переменные типа record. Необходимо сравнить их на равенство. Сравнивать все поля не красиво и глупо.

Заранее спасибо.


Wistler   (2005-07-24 12:25:00) [21]

Написал свою функцию сравнения, в которой сравниавю по полям, так что если изменится структура записи, придётся менять и функции. И как оказалось интересная тема, как написать универсальную функцию сравнения записей.


Leonid Troyanovsky   (2005-07-24 12:18:00) [22]


> Гаврила ©   (24.07.05 12:12) [10]

> но ,если в записи указатели (huge стринг - это указатель),



Почему это не получится?
Если строка тажа самая (вплоть до копий - huge ;),
то - изволь.

Так, что сравнение сравнению - рознь.

--
Regards, LVT.


Leonid Troyanovsky   (2005-07-24 12:13:00) [23]


> Wistler ©   (24.07.05 11:54) [9]
>
> > Что такое "динамической памяти"??

> В функцию надо передать тип Pointer, а не TV!


Дык, передай адрес TV.
Только, оно не решит твоей проблемы, как коллеги уже объяснили.
Если надо сравнивать строки, то record не лучшее для них место. Т.е., или их в TStringList или все в TObject с специализированными методами сравнения.

--
Regards, LVT.


Гаврила   (2005-07-24 12:12:00) [24]


> В функцию надо передать тип Pointer, а не TV!


> Type  
>          TV:record
>            ...
>          end;
>         V1, V2:TV;


Это делается так:
CompareMem(@V1, @V2, ...)
но ,если в записи указатели (huge стринг - это указатель), то, соответственно, не получится, так что - сравнивай по полям


Wistler   (2005-07-24 11:54:00) [25]


> Что такое "динамической памяти"??


В функцию надо передать тип Pointer, а не TV!


Гаврила   (2005-07-24 11:53:00) [26]


> String и запись в которой тоже String.


Кром как "сравнение по полям" ничего не получится


Гаврила   (2005-07-24 11:52:00) [27]


>  [5] Wistler ©



> CompareMem сравнивает данные в динамической памяти, а у
> меня переменные описаны:


Что такое "динамической памяти"??


Wistler   (2005-07-24 11:41:00) [28]


> Какого типа поля у записи?


String и запись в которой тоже String.


Wistler   (2005-07-24 11:39:00) [29]


> Сравниваешь SizeOf, а затем CompareMem.
> Можно и без SizeOf, если они однотипны


CompareMem сравнивает данные в динамической памяти, а у меня переменные описаны:
 Type  
         TV:record
           ...
         end;
        V1, V2:TV;


Можно конечно завести 2 дополнительные переменные типа ^TV, и использовать CompareMem, но хотелось напрямую сравнить 2 переменные.


Anatoly Podgoretsky   (2005-07-24 11:36:00) [30]

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


Lamer@fools.ua   (2005-07-24 11:34:00) [31]

>> Wistler ©   (24.07.05 11:02)

Какого типа поля у записи?


Leonid Troyanovsky   (2005-07-24 11:17:00) [32]


> Wistler ©   (24.07.05 11:02)  
> Доброго времени суток. Аж стыдно за такой вопрос, но заклинило.
>
> Есть 2 переменные типа record. Необходимо сравнить их на
> равенство. Сравнивать все поля не красиво и глупо.


Сравниваешь SizeOf, а затем CompareMem.
Можно и без SizeOf, если они однотипны.

--
Regards, LVT.


Плохиш   (2005-07-24 11:11:00) [33]

В цикле по всем полям, сравнивая соответствующие.


Страницы:   1 2

Наверх

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