![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение записей [D7]
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]В цикле по всем полям, сравнивая соответствующие.