Страница 1 из 3

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

Добавлено: 29 Апрель 2024, 11:57
Губин Игорь
Наткнулся на глюк при использовании необязательных параметров в функциях класса.

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(номер параметра) влево.

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

Добавлено: 29 Апрель 2024, 12:33
finsoftrz
Если я правильно понял. Первый параметр это SELF, нумерация всех остальных с 2. То есть, это не глюк, так и должно быть. То ли в документации где прописано, то ли в обсуждениях в clalist всплывало, давно это было.

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

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

Весело было, когда вчера в семь вечера :facepalm: выяснилось, что из-за этого не работает система макросов... :dizzy:

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

Добавлено: 29 Апрель 2024, 14:09
finsoftrz
У меня в памяти отложилось, что это не специфическая фишка кларионовского компилятора, в других реализациях ооп аналогичный подход.

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

Добавлено: 29 Апрель 2024, 20:10
kreator
Губин Игорь писал(а): 29 Апрель 2024, 11:57 TestClassType.FuncOmittedTest (Long I1, Long I2, Long Long I3, <Real R1>,<Real R2>)
А что такое "Long Long I3"? Очепятка?

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

Добавлено: 29 Апрель 2024, 21:19
Губин Игорь
kreator писал(а): 29 Апрель 2024, 20:10Очепятка?
Она самая. :facepalm: Я руками перебивал :nono:

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

Добавлено: 29 Апрель 2024, 21:33
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).

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

Добавлено: 29 Апрель 2024, 22:46
Губин Игорь
kreator писал(а): 29 Апрель 2024, 21:33 Видимо не там смотрели
Бывает... :facepalm:

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

Добавлено: 30 Апрель 2024, 14:37
Игорь Столяров
Моё субъективное мнение, что omitted() с номерами параметров очень опасный код.
Тупо можно забыть при добавлении параметров в процедуру и получить трудно отлавливаемый глюк.
Всегда пользуюсь только вариантом с именами параметров.

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

Добавлено: 03 Май 2024, 16:47
kreator
Можно ещё воспользоваться overloading'ом. Вообще надёжный вариант без использования omitted.

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

Добавлено: 06 Май 2024, 10:28
Губин Игорь
kreator писал(а): 03 Май 2024, 16:47 Можно ещё воспользоваться overloading'ом. Вообще надёжный вариант без использования omitted.
Как вариант. Может быть, даже более правильный

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

Добавлено: 06 Май 2024, 16:29
Игорь Столяров
kreator писал(а): 03 Май 2024, 16:47 Можно ещё воспользоваться overloading'ом
Всё-таки это немного другой инструмент, позволяющий сделать отдельную обработку.
А если параметры определяют какие-то опции или настройки - то и нет смысла дублировать код.

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

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

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

:dizzy:

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

Добавлено: 06 Май 2024, 17:11
Губин Игорь
Но, в любом случае, борясь нормально освоил, и 100 лет не прошло, overload функций :ty:

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

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

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

Т.е. независимо от того, что Вы фактически передаёте - параметры присутствуют всегда.
Пропущенные VALUE имеют значение пустой строки, а REFERENCE возвращают NULL.