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

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

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

eeigor

@dokol92, спасибо, я позже посмотрю и протестирую с компьютером (через неделю)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: eeigor от  3 августа 2021, 19:35
Sub Foo(Optional Bar As Boolean)
 If IsMissing(Bar) Then Bar = True
End Sub

Вторая часть условия (Then) никогда не будет выполнена, потому что обращение к отсутствующему параметру автоматически устанавливает его значение в FALSE, и TRUE уже не присвоить.

Тогда подумайте и скажите, пожалуйста, как может быть, что

ЦитироватьFunction UDF(Optional bPassedStatus As Boolean)

dim bInnerStatus as boolean

  If IsMissing(bPassedStatus) then bInnerStatus = True

  REM Use the bInnerStatus in the next parts of the function...

Цитата: eeigor от  3 августа 2021, 18:25это и есть абсолютно работающий во всех режимах единственный (простой) вариант использования опциональных переменных в StarBasic – одна переменная для переданного параметра (сам параметр процедуры), а другая для использования в теле после анализа входного параметра*. По другому не так просто, со всеми особенностями.

Ведь до присвоения всё равно не дойдёт.

Разве что это карго-культ по причине того, что
Цитата: eeigor от  3 августа 2021, 18:25Во всяком случае совет дан старожилом форума.
С уважением,
Михаил Каганский

eeigor

Михаил, чтобы невероятное стало очевидным, есть ещё два режима. Вернусь к этой теме позже
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#33
Цитата: mikekaganski от  3 августа 2021, 17:10
https://git.libreoffice.org/core/+/8e323fcacebad1afe9d867b846722a6b9bf20f78

Всё зависит от режима (их три).
Заметил, что в "родном" режиме (без всяких опций) необязательный параметр не инициализируется значением по умолчанию, это так, но вот если задан тип данных, то он сохраняется. Значит, задание типа данных для необязательных аргументов имеет смысл.

Sub Foo(Optional bStatus As Boolean, Optional nIndex%, Optional nValue&)
   If IsMissing(bStatus) Then bStatus = 2
   Print TypeName(bStatus); "="; bStatus  '<< displays: Boolean=True, not Integer=2

   If IsMissing(nIndex) Then nIndex = True
   Print TypeName(nIndex); "="; nIndex  '<< displays: Integer=-1, not Boolean=True

   If IsMissing(nValue) Then nValue = "string"
   Print TypeName(nValue); "="; nValue  '<< displays: Long=0, not String=string
End Sub

В VBA опциональные параметры, проверяемые функцией IsMissing(), должны иметь тип Variant. В StarBasic - любой.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community