Что нового

map - присвоение

RaZum

Знающий
Сообщения
78
Репутация
14
Особенность при присвоении результата выполнения функции
Код:
Global $map[]

_Example ()

Func _Example ()
     $map['key'] = _Error ()
     ConsoleWrite (@Error & @lf)
     $map.key = _Error ()
     ConsoleWrite (@Error & @lf)
EndFunc

Func _Error ()
     Return SetError (1)
EndFunc

Возможно это только у меня такое...
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Особенность при присвоении результата выполнения функции
Код:
Func _Error ()
     SetError (1)
EndFunc
У этой функции нет результата. Чтобы был результат, нужно добавить соответствующую строку.
Код:
Return "my result"
А если речь идёт о функции SetError(), то её установка макрокоманды не навеки. Другое действие может установить новое значение для макрокоманды @error. Я обычно копирую значения из нужных макрокоманд в переменные сразу же после сгенерировашей новые значения функции, чтобы пользоваться зафиксированными в требуемый момент значениями.
Код:
$iError = @error
Цель же функции SetError() вообще другая. Эта функция предназначена для того, чтобы обеспечивать получение кода ошибки через макрокоманду в произвольном скрипте, который любым способом подключил или нативно имел по умолчанию генерирующую значение макрокоманды функцию. "Для себя" внутри скрипта этот ход обычно вообще бесполезен, ведь проще хранить требуемое сразу в удобных переменных.
 
Последнее редактирование:
Автор
R

RaZum

Знающий
Сообщения
78
Репутация
14
:smile:
Смысл не в результате, а в ошибке, которую возвращает макрос @error, при разном формате присвоения результата функции map-переменной.
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Смысл не в результате, а в ошибке
Наверно это не ошибка, а так задумано , т.к. идёт присвоение - оно прошло успешно поэтому @Error=0
Это и в $map.key , это и в $vTag.Left
А в $map['key'] и в $aRet[0] @Error=1

Код:
Global $map[],$aRet[5]

_Example ()

Func _Example ()
     $map['key'] = _Error ()
     MsgBox(4096,'---',@Error & @lf)
     $map.key=_Error ()
     MsgBox(4096,'---',@Error & @lf)
     $vTag=DllStructCreate('long Left;long Top;long Right;long Bottom')
     $vTag.Left=_Error()
     MsgBox(4096,"---",@Error & @lf)
     $aRet[0]=_Error ()
     MsgBox(4096,"---",@Error & @lf)
EndFunc

Func _Error ()
     SetError (1)
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Макрос @error устанавливает функция. Нигде не указано (или я чего-то не знаю?), что присваивание (=) должно устанавливать @error.
Также, в справке указано: "пользовательские функции возвращают 0, если другое возвращаемое значение не задано". Если посмотреть значения в скрипте Andrey_A, то все они будут нули. Что соответствует значению, возвращаемому функцией без Return.
 
Автор
R

RaZum

Знающий
Сообщения
78
Репутация
14
Макрос @error устанавливает функция. Нигде не указано (или я чего-то не знаю?), что присваивание (=) должно устанавливать @error.
Также, в справке указано: "пользовательские функции возвращают 0, если другое возвращаемое значение не задано". Если посмотреть значения в скрипте Andrey_A, то все они будут нули. Что соответствует значению, возвращаемому функцией без Return.
Только заметил, моя ошибка.
С мобилы трудно все набирать и не ошибиться.
Надо просто добавить этот самый Return в функцию _Error и все сразу станет понятно
Извиняюсь за свой недогляд.

Но это не меняет ситуации с возвратом разных значений ошибки от функции при присвоении map-переменной
Сообщение автоматически объединено:

поправил начальный код
Сообщение автоматически объединено:

кстати, для проверки можно просто использовать что-то из стандартного набора, например
Код:
$map['key'] = FileRead('qwerty')
$map.key = FileRead('qwerty')
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
не меняет ситуации с возвратом разных значений ошибки от функции при присвоении map-переменной
Когда присваивание идёт напрямую, то @error=1, то есть то, что установлено в функции.
В случае присваивания через $map.key, вероятно, возвращается какой-то внутренний @error от функции, которая находит параметр через дот-нотацию. При обращении к несуществующим ключам - они создаются и, вероятно, этот успешный @error перекрывает возвращённый функцией.
Код:
Global $map[]
$map.key = 1
ConsoleWrite(@error & @CRLF) ; 0


Пример для структур, возможно, подтверждающий предположение. Тут фиксируется @error для дот-нотации, потому что поле j не существует и не может быть создано
Код:
$t = DllStructCreate("byte i")
$t.i = 1
ConsoleWrite(@error & ":" & $t.i & @CRLF) ; 0:1
$t.j = 1
ConsoleWrite(@error & ":" & $t.j & @CRLF) ; 2:0
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Короче говоря, не надо вообще ожидать прямой информации из выводимых макрокомандами значений сразу после обращения к "чёрному ящику", который не обещает заботиться об этих значениях каким-либо декларируемым в описании способом. А тем более не сразу, а ещё после каких-то лишних "телодвижений".
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
не надо вообще ожидать прямой информации из выводимых макрокомандами значений сразу после обращения
Не согласен. Или не понял...
Обращаться к макросам нужно. И именно сразу, пока они содержат актуальные значения.

Дот-нотация изначально использовалась только для объектов и интерфейсов. При обращении к свойству объекта или при вызове метода объекта всегда устанавливается @error. Это явно не указано в справке, но проверено на практике. Вот пример, доказывающий, что успешное выполнение метода переписывает @error
Код:
$oShell = ObjCreate("shell.application")
ErrFunc()
$err1 = @error
$oShell.MinimizeAll
$err2 = @error
ConsoleWrite($err1 & ":" & $err2 & @CRLF) ; 1:0

Func ErrFunc()
  Return SetError(1)
EndFunc

Позднее дот-нотация появилась для структур, а теперь и для map. И вполне вероятно, что используется тот же механизм, что и для объектов. То есть при обращении через дот-нотацию возвращается @error выполнения этой операции.
 
Автор
R

RaZum

Знающий
Сообщения
78
Репутация
14
Осмелюсь предположить, что и скорость присвоения значений ключам map, при разных форматах записи, будет отличаться.
Ко всему прочему, странный формат записи присвоения через дот-нотацию для map, т.к. ключ в этом случае может быть только строкой. А это значит что может быть или переприсвоение, либо добавление. Значит ошибку может вызвать только превышение количества символов (или неподдерживаемые - если такое возможно).
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ключ в этом случае может быть только строкой
Верно. И реализация map для AutoIt могла бы быть простой и понятной, если бы сделали:
1. Ключ - строка, не зависящая от регистра
2. Функция MapAppend принимает три параметра (map, key[, value = ""])
А так... прикрутили синей изолентой по принципу "чтобы было".
Это всё моё личное мнение и оно может не совпадать с мнением других участников форума.
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Не согласен. Или не понял...
Скорее, второе.
Обращаться к макросам нужно. И именно сразу, пока они содержат актуальные значения.
Конечно, нужно и именно сразу, пока значения актуальны. И если значения понадобятся позднее, то для сохранения актуальности скопировать их, присвоив переменным.

С другой стороны, причём примерно по тем же причинам, не стоит ожидать, что макрокоманды выведут актуальные значения, когда их пытаться вылавливать после выполнения строк скрипта, которое в своей неизвестной внутренней кухне использует функции, устанавливающие новые значения, но в целом не заботится о том, чтобы в конце этого выполнения подобных строк значения устанавливались по каким-либо правилам, декларируемым в описании к таким действиям. Например, как в случае со строкой в дот-нотации, которая "под капотом" сама выполняет обращения к функциям. Тогда к результатам изменения значений, устанавливаемых для макрокоманд, можно относится на уровне "пасхалок". Ну или покопаться в коде и выловить самостоятельно закономерности, не декларируемые справкой, что само по себе не отменит понятие пасхального яйца.
 
Верх