Что нового

Обсуждение AutoIt бета-версий

firex

AutoIT Гуру
Сообщения
943
Репутация
203
madmasles
Я к тому, что разницы между следующими вариантами записи нет:
Код:
If @error Then Return 0
If @error Then Return SetError(@error, @extended, 0)


Тогда зачем заставлять интерпретатор производить бессмысленный вызов SetError? Разработчики дают советы на счет оптимизации кода, однако сами творят бесполезные конструкции.
 

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
в принципе, разницы нет. если только после отработки функции не используешь макрос @error для проверки ошибки.
ну а так да, если посмотреть внимательно, то вообще макрос @error не нужен. достаточно вернуть значение. можно в возвращаемой строке указать все, что нужно.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
firex, joiner,
У Yashied`а в WinAPIEx.au3 раньше было
Код:
;~ ...
If @error Then
	Return SetError(1, 0, -1)
Else
	If $Ret[0] Then
		Return SetError(1, $Ret[0], -1)
	EndIf
EndIf
;~ ...
;~ или
;~ ...
If (@error) Or (Not $Ret[0]) Then
	Return SetError(1, 0, 0)
EndIf
;~ ...
Зачем понадобилось изменять эти, ИМХО, правильные конструкции, я не знаю.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
203
joiner [?]
если только после отработки функции не используешь макрос @error для проверки ошибки.
Код:
Func _Example1()
	SetError( 1 )
	Return SetError( @Error, @Extended, 0 )
EndFunc

Func _Example2()
	SetError( 1 )
	Return 0
EndFunc

ConsoleWrite( _Example1() & " " & @Error & @CRLF)
SetError( 0 )
ConsoleWrite( _Example2() & " " & @Error & @CRLF)


Return не сбрасывает флаг, это ведь не встроенная функция.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
firex
Прочитал ещё раз справку по SetError
то после завершения функции @error равен 0, даже если внутренние вызовы функций устанавливают иное значение
Из этого описания следует, что если не вернуть явно значения @error и @Extended, то они будут равны 0. Допустим это поведение изменено в текущей версии AutoIt3, но не факт что UDF была написана или полностью переработана под новую версию AutoIt3, а просто перекочевала в том виде в каком была и не противоречила поведению текущей версии. А то что сейчас написано в русской справке для версии 3.3.8.1 точно соответствует поведению, потому что я тщательно проверял эту функцию. Я даже спорил по поводу почему не указано явно возвращение 1, потому что сбивает с толку при использовании SetError(1) по умолчанию возвращается 1, а не ожидаемое 0.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
203
AZJIO [?]
о умолчанию возвращается 1, а не ожидаемое 0.
Так и должно быть.
Код:
SetError ( code [, extended = 0 [, return value = 1 ]] )
что если не вернуть явно значения @error и @Extended, то они будут равны 0
Это касается только SetError, и только если требуется модифицировать определенный флаг. К примеру:
Код:
Return SetError( @Error + 1, @Extended, 0 )

Таким образом мы модифицируем @Error без сброса флага @Extended, тут смысл есть, временами я сам использую подобную конструкцию.

Однако я имел ввиду именно следующие случаи:
Код:
Return SetError( @Error, @Extended, 0 )

Фактически они абсолютно бессмысленны. Дело даже не в различном поведении SetError на разных версиях, а в том, что функция попросту вызывается зря и ничего не меняет.

Команда Return не обращает внимание и не сбрасывает значения флагов в любом случае, ровным счетом как и обычные операции на переменными.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
firex [?]
Команда Return не обращает внимание и не сбрасывает
А кто говорт что она сбрасывает? Сама функция сбрасывает эти значения.
Попробуй пример
Код:
$iResult = myFunc()
If @error Then
    MsgBox(4096, @AutoItVersion, "Ошибка = " & @error)
Else
    MsgBox(4096, @AutoItVersion, 'результат ' & $iResult)
EndIf

Func myFunc()
    Local $sOutput = StringRegExpReplace('тест', "[aeiou)", "@")
	; If @error Then Return SetError(@error, @extended, 0)
    Return $sOutput
EndFunc

В данном случае StringRegExpReplace возвращает ошибку, но она не передаётся по наследству функции myFunc и последняя возвращает значение и ошибку равную 0, то есть не транслирует ошибку StringRegExpReplace наружу. Попробуй теперь раскомментировать строку и теперь ошибка StringRegExpReplace транслирыется наружу и функция myFunc возвратит ошибку равную 2.

Так и должно быть.
с какой стати? По умолчанию функция возвращает 0, почему же SetError без указания возвращаемого значения возвращает 1? Во вторых это появилось после того когда я отписал что поведение не ожидаемо и любой человек столкнётся рано или поздно с ошибкой. Разница в том что я указал, что возврат 1 должен быть указан в "Возвращаемой значение".
 

firex

AutoIT Гуру
Сообщения
943
Репутация
203
AZJIO
Вот оно в чем дело... Так выходит без форсирования флагов с помощью SetError / SetExtended пользовательская функция их за собой обнуляет? Возможно я ошибаюсь, но разве было такое поведение в более ранних версиях?

что поведение не ожидаемо
Согласен, хотя с точки зрения NTSTATUS 0 - успех, и вызов функции SetError его не подразумевает.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
firex [?]
но разве было такое поведение в более ранних версиях?
я проверил, у меня и в новой версии такое же поведение. Так что ничего не изменилось и всё как написано в русской справке.

Попробуй ещё интересное поведение, пример:
Код:
$iResult = myFunc()
MsgBox(4096, @AutoItVersion, 'результат ' & $iResult)

Func myFunc()
	SetError(@error, @extended, 13)
EndFunc

Здесь SetError фактически не устанавливает значение функции с умолчального 0 на 13, а значит форма записи SetError не верна и должна использоваться с Return. То есть SetError просто копирует переданной значение 13 в возвращаемое значение и не устанавливает его для данной функции по умолчанию.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
203
AZJIO [?]
То есть SetError просто копирует переданной значение 13 в возвращаемое значение и не устанавливает его для данной функции по умолчанию.
Из этого может выйти приятная вещь. Подразумевается, что если функция была остановлена Return'ом без значения, то она вернет 1. В некоторых случаях может быть удобной альтернативой.

Код:
Func myFunc()
	SetError( 1, 1, 1 )
	
	; ...

	Return
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
firex
Согласен, хотя с точки зрения NTSTATUS 0 - успех, и вызов функции SetError его не подразумевает.
С точки зрения AutoIt3 если проследить за многими функциями, то при успехе они возвращают 1 и это в чистом виде используется в условиях "если 1, то делаем то-то", соответственно 0 воспринимается как не успех, и тут вдруг используя SetError(1) это поведение меняется незаметно для пользователя, а он использует это возвращаемое значение как флаг.


Добавлено:
Сообщение автоматически объединено:

firex [?]
Из этого может выйти приятная вещь
Как ни странно но это опять не поддерживается. Сейчас проверил, если после SetError были функции, то они затирают установленные значения SetError.
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
v3.3.13.20 "не заставила себя долго ждать". Более полугода прошло после последнего обновления и что исправлено - практически ничего.
  • Map использует 64 битные целые
  • 2 обновления в документации
В UDF:
  • Cамое главное, это пожалуй то, что теперь вместо указателя ptr* можно передать структуру по ссылке struct*
  • 1 изменение в _Word_DocOpen() ломающая обратную совместимость. Внимание тем кто пользуется, читайте документацию.
  • и больше ничего интересного, исправлены баги, дописана документация, добавлены примеры.
Au3Check:
  • Поддерживает UTF-8 файлы с BOM
Тут список всех изменений:
http://www.autoitscript.com/forum/topic/169102-autoit-v331320-beta/
 
Сообщения
2
Репутация
-1
А что никому не важно, что в проге троян есть?
_https://www.virustotal.com/ru/file/180908de50a505a8b0ace2166ad457d0f39d4e6bb036815920989ce32d6b4769/analysis/
и тут SciTE4AutoIt3 :
_https://www.virustotal.com/ru/file/feeca9953c4acf280298ac6b3fcd54ff3cdab918ba40d028c251281c96525b2c/analysis/

вы всё это с троянами юзаете?
_https://www.virustotal.com/ru/file/41f447a25f801e0a5ed9faf55956e27244380e9d49e7ecf2e10adf51fa84d747/analysis/
 

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
неужели? умные пользователи юзают адекватные антивири. по поводу реакции антивирусов есть тема. если не лень, найди и прочти
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Lagoda
прошелся по твоим ссылкам. на каждый файл сработали не более 4 антивирусов из 50+. это очень низкий показатель и скорее всего ложное срабатывание. я бы не был так категоричен в высказываниях. учитывая, что многие антивирусы не любят autoit в принципе.
 

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
версия 3.3.13.20
при чтении из файла возвращает бинарные данные вместо текстовых.
открытие файла делал по умолчанию(для чтения)
плюс проблема с ошибкой выделения памяти. использовался один и тот же код. на версиях 3.3.12.0
Хотел переписать код и воспользоваться функциями Map из новой версии языка, но, видимо, придется подождать :smile:
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 192
joiner
при чтении из файла возвращает бинарные данные вместо текстовых
Обсуждалось в этой же теме: Ответ #197
Сообщено разработчикам 7 месяцев назад: #2901
Что-то Jon совсем проект забросил. Печально :(
 

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
а по поводу Error allocating memory?
 

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
понятно. печалька еще какая. походу, последняя стабильная версия на долго
 
Верх