Что нового

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

firex

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


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

joiner

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
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
Репутация
206
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,756
Репутация
1,151
firex
Прочитал ещё раз справку по SetError
то после завершения функции @error равен 0, даже если внутренние вызовы функций устанавливают иное значение
Из этого описания следует, что если не вернуть явно значения @error и @Extended, то они будут равны 0. Допустим это поведение изменено в текущей версии AutoIt3, но не факт что UDF была написана или полностью переработана под новую версию AutoIt3, а просто перекочевала в том виде в каком была и не противоречила поведению текущей версии. А то что сейчас написано в русской справке для версии 3.3.8.1 точно соответствует поведению, потому что я тщательно проверял эту функцию. Я даже спорил по поводу почему не указано явно возвращение 1, потому что сбивает с толку при использовании SetError(1) по умолчанию возвращается 1, а не ожидаемое 0.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
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,756
Репутация
1,151
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
Репутация
206
AZJIO
Вот оно в чем дело... Так выходит без форсирования флагов с помощью SetError / SetExtended пользовательская функция их за собой обнуляет? Возможно я ошибаюсь, но разве было такое поведение в более ранних версиях?

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

AZJIO

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

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

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

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

firex

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

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

	Return
EndFunc
 

AZJIO

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


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

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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
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,396
Репутация
594
неужели? умные пользователи юзают адекватные антивири. по поводу реакции антивирусов есть тема. если не лень, найди и прочти
 

kaster

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

joiner

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

InnI

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

joiner

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

joiner

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