Ada_Ru форум

Обсуждение языка Ада

record compare

Оставить новое сообщение

Сообщения

Dmitriy Anisimkov
record compare
2012-08-08 08:18:09

Определяю операцию сравнения для типа данных.

Потом создаю рекорд содержащий этот тип данных.

Потом двоично разные но одинаковые с точки зрения операции сравнения поля помещаю в 2 рекорда.

Рекорды оказываются не равны.

Как Ада должен сравнивать рекорды, чисто двоично, или для элементов вызывать операцию сравнения ?

Может на RPM кто укажет ?

Смутно припоминаю что даже C++ вызывает операцию сравнения для полей рекорда.

 

В ломы по английски писать. Если тут не ответят, попытаюсь в Ада Коре написать.

Пример в прицепе.

On 08/08/2012 03:18 PM, Dmitriy Anisimkov wrote:

Определяю операцию сравнения для типа данных.

Потом создаю рекорд содержащий этот тип данных.

Потом двоично разные но одинаковые с точки зрения операции сравнения поля помещаю в 2 рекорда.

Рекорды оказываются не равны.

Как Ада должен сравнивать рекорды, чисто двоично, или для элементов вызывать операцию сравнения ?

Может на RPM кто укажет ?

Очепятка, на Ada RM конечно.

On Wed, 08 Aug 2012 15:19:38 +0700, you wrote:

 

On 08/08/2012 03:18 PM, Dmitriy Anisimkov wrote:

Определяю операцию сравнения для типа данных.

Потом создаю рекорд содержащий этот тип данных.

Потом двоично разные но одинаковые с точки зрения операции сравнения поля помещаю в 2 рекорда.

Рекорды оказываются не равны.

Как Ада должен сравнивать рекорды, чисто двоично, или для элементов вызывать операцию сравнения ?

Может на RPM кто укажет ?

Очепятка, на Ada RM конечно.

 

RM 4.5.2 (24)

 

Предопределенная операция сравнивает по-компонентно, причем компоненты сравниваются используя предопределенные операции. Т.е. Ваша операция тихо игнорируется, если конечно не primitive operation (= tagged компонента).

Мораль: надо переопределять равенство record типа.

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

On 08/08/2012 04:27 PM, Dmitry A. Kazakov wrote:

On Wed, 08 Aug 2012 15:19:38 +0700, you wrote:

 

On 08/08/2012 03:18 PM, Dmitriy Anisimkov wrote:

Определяю операцию сравнения для типа данных.

Потом создаю рекорд содержащий этот тип данных.

Потом двоично разные но одинаковые с точки зрения операции сравнения

поля помещаю в 2 рекорда.

Рекорды оказываются не равны.

Как Ада должен сравнивать рекорды, чисто двоично, или для элементов

вызывать операцию сравнения ?

Может на RPM кто укажет ?

Очепятка, на Ada RM конечно.

RM 4.5.2 (24)

 

Предопределенная операция сравнивает по-компонентно, причем компоненты

сравниваются используя предопределенные операции. Т.е. Ваша операция тихо

игнорируется, если конечно не primitive operation (= tagged компонента).

 

Мораль: надо переопределять равенство record типа.

Простите не понял, даже прочитав RM

прав ли GNAT игнорируя мою операцию сравнения.

Теперь кажется понял. Если компанент tagged, тогда операция = учтется.

Пример в прицепе.

 

On 08/08/2012 04:45 PM, Dmitriy Anisimkov wrote:

On 08/08/2012 12:18 PM, Dmitriy Anisimkov wrote:

Определяю операцию сравнения для типа данных.

Потом создаю рекорд содержащий этот тип данных.

Потом двоично разные но одинаковые с точки зрения операции сравнения

поля помещаю в 2 рекорда.

Рекорды оказываются не равны.

Как Ада должен сравнивать рекорды, чисто двоично, или для элементов

вызывать операцию сравнения ?

Может на RPM кто укажет ?

Смутно припоминаю что даже C++ вызывает операцию сравнения для полей

рекорда.

 

В ломы по английски писать. Если тут не ответят, попытаюсь в Ада Коре

написать.

Пример в прицепе.

 

Ada2012 (или Ada2005) изменили семантику оператора сравнения. В Ada95 операция по умолчанию выполняла "побитовое" сравнение двух записей; тогда как сейчас она выполняет покомпонентное сравнение с использованием соответствующих операций сравнения.

Проверил в GNAT GPL 2012

 

И действительно.

с ключом -gnat2012 выполняет покомпонентное сравнивание.

с ключом -gnat05 и без ключа выполняет побитовое сравнение.

 

 

On 08/08/2012 10:28 PM, Vadim Godunko wrote:

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти