Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

4 Декабрь 2021, 08:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 »   Вниз
  Печать  
Автор Тема: Странность с пропущенными параметрами.  (Прочитано 1662 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ost
Форумчанин
***
Offline Offline

Сообщений: 229


« Стартовое сообщение: 3 Август 2021, 16:10 »

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

https://yadi.sk/i/9OwKklryqrODGA
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 389


« Ответ #1: 3 Август 2021, 16:27 »

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

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #2: 3 Август 2021, 16:37 »

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

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

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

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

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=105086
« Последнее редактирование: 3 Август 2021, 16:45 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
ost
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #3: 3 Август 2021, 16:40 »

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

Пол: Мужской
Сообщений: 752



« Ответ #4: 3 Август 2021, 16:59 »

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

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 617


WWW
« Ответ #5: 3 Август 2021, 17:04 »

Давайте продолжим дискуссию. 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

На мой взгляд, возможность узнать, опущен ли параметр любого типа - это хорошо.
« Последнее редактирование: 3 Август 2021, 17:09 от sokol92 » Записан

Владимир.
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 389


« Ответ #6: 3 Август 2021, 17:10 »

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

Всё зависит от режима (их три).
« Последнее редактирование: 3 Август 2021, 17:12 от mikekaganski » Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #7: 3 Август 2021, 17:12 »

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

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

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

Upd
Михаил, Вы удалили своё сообщение, но там были ссылки по теме, которые я не успел просмотреть (один, даа, три, четыре). Не могли бы опубликовать ссылки заново?
« Последнее редактирование: 3 Август 2021, 17:24 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 389


« Ответ #8: 3 Август 2021, 17:24 »

Доброго. Почему фактически пропущенный параметр таким не является?
При запуске 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
« Последнее редактирование: 3 Август 2021, 17:32 от mikekaganski » Записан

С уважением,
Михаил Каганский
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 617


WWW
« Ответ #9: 3 Август 2021, 17:28 »

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

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

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #10: 3 Август 2021, 17:33 »

Да, три режима. Плюс использование на листе. Ведь если «пропустить» необязательные аргументы, поставив серию точек с запятой, будут ли они действительно пропущены? Или как-то интерпретироваться иначе? И теперь всё это в трёх режимах. Поэтому об «исследовании» этой темы я и говорил выше. В VBA этой проблемы нет, и режим только один!
« Последнее редактирование: 3 Август 2021, 17:35 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 389


« Ответ #11: 3 Август 2021, 17:38 »

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

С уважением,
Михаил Каганский
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 617


WWW
« Ответ #12: 3 Август 2021, 17:39 »

Похоже, что баг всё-таки в обработке синтаксиса

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

Код:
test2(,"Arg2")

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

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

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #13: 3 Август 2021, 17:44 »

 Много всего… интересного. Эта «мутная» тема достойна прояснения и обобщения, ибо важна для работы с макросами.
Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #14: 3 Август 2021, 17:49 »

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

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, не могу сказать. Не помню. Нет компьютера под рукой.
« Последнее редактирование: 3 Август 2021, 17:57 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
Страниц: 1 2 3 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!