Глюк с Omitted в функциях внутри класса

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

Наткнулся на глюк при использовании необязательных параметров в функциях класса.

Clarion 11.1.13855, Link mode: Lib, от Debug/Release не зависит

Код: Выделить всё

TestClassType      Class,Type
...
FuncOmittedTest       Procedure(Long I1, Long I2, Long Long I3, <Real R1>,<Real R2>) 
...
                         END

TestClassType.FuncOmittedTest (Long I1, Long I2, Long Long I3, <Real R1>,<Real R2>) 

Code

                 Stop(Omitted(4) & ' - ' & Omitted(5) & ' : ' & Stop(Omitted(R1) & ' - ' & Omitted(R2)))



TestClassClass     TestClassType

                           TestClassClass(1,2,3,,6.0) ! Выводит: 0 - 1 : 1 - 0
                           TestClassClass(1,2,3,5.0,) ! Выводит: 0 - 0 : 0 - 1


Проверено на большом количестве сочетаний. Диагноз: при работе с функциями в классе в самое начало списка параметров подставляется какой-то параметр, который и вызывает такой сдвиг Omitted(номер параметра) влево.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4655
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 7 раз
Поблагодарили: 37 раз

Глюк с Omitted в функциях внутри класса

Сообщение finsoftrz »

Если я правильно понял. Первый параметр это SELF, нумерация всех остальных с 2. То есть, это не глюк, так и должно быть. То ли в документации где прописано, то ли в обсуждениях в clalist всплывало, давно это было.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

finsoftrz писал(а): 29 Апрель 2024, 12:33 То ли в документации где прописано, то ли в обсуждениях в clalist всплывало, давно это было.
Да, что-то такое пробегало. Но в документации это не указано (специально смотрел).

Весело было, когда вчера в семь вечера :facepalm: выяснилось, что из-за этого не работает система макросов... :dizzy:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4655
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 7 раз
Поблагодарили: 37 раз

Глюк с Omitted в функциях внутри класса

Сообщение finsoftrz »

У меня в памяти отложилось, что это не специфическая фишка кларионовского компилятора, в других реализациях ооп аналогичный подход.
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4999
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 21 раз

Глюк с Omitted в функциях внутри класса

Сообщение kreator »

Губин Игорь писал(а): 29 Апрель 2024, 11:57 TestClassType.FuncOmittedTest (Long I1, Long I2, Long Long I3, <Real R1>,<Real R2>)
А что такое "Long Long I3"? Очепятка?
We are hard at work… for you. :)
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

kreator писал(а): 29 Апрель 2024, 20:10Очепятка?
Она самая. :facepalm: Я руками перебивал :nono:
Это я только кажусь дураком! На самом деле я полный идиот!
kreator
✯ Ветеран ✯
Сообщения: 4999
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 21 раз

Глюк с Omitted в функциях внутри класса

Сообщение kreator »

Губин Игорь писал(а): 29 Апрель 2024, 12:41 Да, что-то такое пробегало. Но в документации это не указано (специально смотрел).
Видимо не там смотрели. Из справки по Omitted:
All CLASS methods have an implicit first parameter which is always passed--the CLASS name. This means that OMITTED(1) will always return false for a CLASS method. Any actual parameters passed to the method are numbered beginning with two (2). Therefore, to test whether two actual parameters to a CLASS method are passed means you must test positions two (2) and three (3).
We are hard at work… for you. :)
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

kreator писал(а): 29 Апрель 2024, 21:33 Видимо не там смотрели
Бывает... :facepalm:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7404
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 49 раз

Глюк с Omitted в функциях внутри класса

Сообщение Игорь Столяров »

Моё субъективное мнение, что omitted() с номерами параметров очень опасный код.
Тупо можно забыть при добавлении параметров в процедуру и получить трудно отлавливаемый глюк.
Всегда пользуюсь только вариантом с именами параметров.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4999
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 21 раз

Глюк с Omitted в функциях внутри класса

Сообщение kreator »

Можно ещё воспользоваться overloading'ом. Вообще надёжный вариант без использования omitted.
We are hard at work… for you. :)
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

kreator писал(а): 03 Май 2024, 16:47 Можно ещё воспользоваться overloading'ом. Вообще надёжный вариант без использования omitted.
Как вариант. Может быть, даже более правильный
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7404
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 49 раз

Глюк с Omitted в функциях внутри класса

Сообщение Игорь Столяров »

kreator писал(а): 03 Май 2024, 16:47 Можно ещё воспользоваться overloading'ом
Всё-таки это немного другой инструмент, позволяющий сделать отдельную обработку.
А если параметры определяют какие-то опции или настройки - то и нет смысла дублировать код.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

Игорь Столяров писал(а): 06 Май 2024, 16:29 Всё-таки это немного другой инструмент, позволяющий сделать отдельную обработку.
А если параметры определяют какие-то опции или настройки - то и нет смысла дублировать код.
Как модно говорить "в политических спорах", не всё так однозначно.

Попробуйте преобразовать с использованием overloading
AFunction Procedure(Signed,<string>,<string>)

:dizzy:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2349
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 19 раз

Глюк с Omitted в функциях внутри класса

Сообщение Губин Игорь »

Но, в любом случае, борясь нормально освоил, и 100 лет не прошло, overload функций :ty:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7404
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 16 раз
Поблагодарили: 49 раз

Глюк с Omitted в функциях внутри класса

Сообщение Игорь Столяров »

Губин Игорь писал(а): 06 Май 2024, 17:09 Попробуйте преобразовать с использованием overloading
Когда-то давным-давно на ClaHUB были тёрки про пропущенные параметры и Omitted().
И пасаны посовещавшись пришли к выводу, что это всё иллюзия развитого синтаксиса языка.

Идея была в том, что бы получить ошибку при обращении к несуществующему параметру.
И это сделать не удалось ... по крайне мере в актуальной тогда версии Clarion.

Т.е. независимо от того, что Вы фактически передаёте - параметры присутствуют всегда.
Пропущенные VALUE имеют значение пустой строки, а REFERENCE возвращают NULL.
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить