Странность с пропущенными параметрами.

Автор ost, 3 августа 2021, 16:10

0 Пользователи и 1 гость просматривают эту тему.

ost

Доброго. Почему фактически пропущенный параметр таким не является?
При запуске test1 из файла по ссылке получаю сообщение. Почему так? На деле параметр "sArg1" пропущен.

https://yadi.sk/i/9OwKklryqrODGA

mikekaganski

Optional может быть missing-объектом только если это Variant, у которого есть соответствующее состояние (по факту это значение - особого вида ошибка, что и можно проверить). Иначе - в случае явно заданных типов - переменная всегда имеет одно из допустимых значений для данного типа. По умолчанию пропущенное значение Optional-аргумента с фиксированным типом получает значение по умолчанию для данного типа (например, пустую строку для случая строкового аргумента).
С уважением,
Михаил Каганский

eeigor

#2
Не соглашусь с Михаилом: описано абсолютно правильное поведение... но для VBA.

«например, пустую строку для случая строкового аргумента».
Увы, и со строковым нулем ("0") тоже приходится сравнивать, если использовать на листе.

Здесь, похоже, StarBasic "недоделан", работает непостоянно (до конца не исследовал, поднимал на англоязычном форуме – вопросы остались). К тому же, если пропущены аргументы в UDF на листе, то всё тоже неоднозначно... Другими словами, Optional – это тема отдельного «исследования», которую я начинал, но ещё не завершил...

Upd
Нужна тестовая книга с примерами, которая «разъяснит» все нюансы. Моя – в процессе... Если у кого есть, выкладывайте.

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=105086
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

ost

Доходчиво. Спасибо. Нашел сейчас это сообщение и ссылку в нем. https://forumooo.ru/index.php/topic,8645.0/msg,58330.html

eeigor

На сегодня самый безопасный, но «неэффективный» способ работы с необязательными аргументами в StarBasic – это инициализация соответствующей внутренней переменной в соответствии со значением переданного параметра. Так делают другие. Лично меня «напрягает» этот «двойной комплект» переменных в теле процедуры. В VBA всё и всегда в этом отношении работало безукоризненно, как Михаил и описал. Но то, что здесь это далеко не так, для меня очевидно: спотыкался неоднократно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#5
Давайте продолжим дискуссию. TestSub (по ссылке из #4) по-прежнему (LO 7.1.5.2) выдает True. Если Mysub в TestSub вызвать с параметром, то выдается False.
Для удобства продублирую:

Sub Mysub(Optional ByVal opt As Boolean)
 MsgBox IsMissing(opt)
End Sub

Sub TestSub
 Mysub
End Sub


На мой взгляд, возможность узнать, опущен ли параметр любого типа - это хорошо.
Владимир.

mikekaganski

#6
https://git.libreoffice.org/core/+/8e323fcacebad1afe9d867b846722a6b9bf20f78

Всё зависит от режима (их три).
С уважением,
Михаил Каганский

eeigor

#7
Я тоже за продолжение дискуссии. Из-за этой «темы» многие мои «наработки» выглядят незавершёнными. Речь о UDF, работающих с родными диапазонами в коде и принимающих «неродные» Excel Range на листе при выборе их пользователем мышкой в ходе ввода параметра (Option Compatible).
При такой вариативности использования UDF с прочими строковыми, логическими необязательными параметрами возникают проблемы. С численными проблем меньше.

Строковый необязательный параметр, к примеру, надо проверить на IsMissing(), на <> "0", на <> "". В общем, невесело...

Прим. "0" – это видение пропущенного параметра при использовании на листе. Как пустые ячейки интерпретируются как ноль, так и пропущенный строковый параметр – "0" (ноль в кавычках).

Upd
Михаил, Вы удалили своё сообщение, но там были ссылки по теме, которые я не успел просмотреть (один, даа, три, четыре). Не могли бы опубликовать ссылки заново?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

#8
Цитата: ost от  3 августа 2021, 16:10
Доброго. Почему фактически пропущенный параметр таким не является?
При запуске test1 из файла по ссылке получаю сообщение. Почему так? На деле параметр "sArg1" пропущен.

Всё не так.

Во-первых, о дискуссии. Всё чётко описано по ссылке на исправление, приведённой в #6. Если до этого оно работало нестабильно, начиная с версии 7.0 должно работать, как указано там. Дискуссия окончена.

Теперь о файле из начального сообщения.
Там используется нативный режим (без Option Compatible или Option VBASupport). При этом доступны правильные Missing-переменные любого типа (вопреки тому, что я написал в #1; также они доступны при использовании Option Compatible - но там возможны и явно заданные значения по умолчанию). Однако у Вас используется синтаксис test2(sArg2:="Arg2"), которые не работает в нативном режиме - так что значение "Arg2" передаётся в первый по порядку аргумент. Баг в том, что мы должны по-хорошему выдать ошибку компиляции на := без поддержки расширений (не уверен, должно это быть Option Compatible или Option VBASupport).
Похоже, что баг всё-таки в обработке синтаксиса :=, который должен работать в нативном режиме: https://help.libreoffice.org/7.3/en-US/text/sbasic/shared/01020300.html?&DbPAR=BASIC&System=WIN
С уважением,
Михаил Каганский

sokol92

Цитата: mikekaganski от  3 августа 2021, 17:10Всё зависит от режима (их три)
Режимы я смотрел (всегда работаю c Option Compatible). Если задан режим VBASupport 1, то, да, IsMissing (похоже) работает только для Variant.

Что касается разницы между поведением тестов в стартовом сообщении и #5, то, мне кажется, разница в том, что стартовом сообщении пропущен первый необязательный параметр из двух, а в #5 необязательный параметр один.
Владимир.

eeigor

#10
Да, три режима. Плюс использование на листе. Ведь если «пропустить» необязательные аргументы, поставив серию точек с запятой, будут ли они действительно пропущены? Или как-то интерпретироваться иначе? И теперь всё это в трёх режимах. Поэтому об «исследовании» этой темы я и говорил выше. В VBA этой проблемы нет, и режим только один!
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

"Использование на листе" (по-видимому, описывается "использование в качестве UDF") - совершенно не относится к работе Basic, и связано с работой Calc, у которого нет в принципе возможности пропустить необязательные параметры перед явно заданными - см., например, комментарий к STYLE. Поэтому нет никакого "и теперь всё это в трёх режимах".
С уважением,
Михаил Каганский

sokol92

Цитата: mikekaganski от  3 августа 2021, 17:24Похоже, что баг всё-таки в обработке синтаксиса

В стартовом сообщении если написать

test2(,"Arg2")

то, вроде, все нормально.

Мне кажется, я сталкивался с проблемами, когда указан необязательный параметр, перед которым есть пропущенный необязательный параметр. Постараюсь воспроизвести.
Владимир.

eeigor

 Много всего... интересного. Эта «мутная» тема достойна прояснения и обобщения, ибо важна для работы с макросами.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#14
Михаил, за ссылку спасибо. Один вопрос можно считать разъясненным.

In the LibreOffice Calc functions, parameters marked as "optional" can be left out only when no parameter follows. For example, in a function with four parameters, where the last two parameters are marked as "optional", you can leave out parameter 4 or parameters 3 and 4, but you cannot leave out parameter 3 alone.

Отсюда и появляются строковые нули "0", или же пользователь должен явно ввести "".

Upd
Кстати, как с эти в Excel, не могу сказать. Не помню. Нет компьютера под рукой.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community