Что нового

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

Andrey_A

Осваивающий
Сообщения
213
Репутация
42
Обнаружил такой баг, попался намедни текст, который никак не хотел сравниваться, ни "=", ни "==", ни StringCompare() не помогали... Опытным путём выяснил, что это из-за символа ChrW(422) и его нижний регистр ChrW(640)
Может есть сторонние методы сравнение такого?

Код:
$sSym=ChrW(422)
$sSymLow=StringLower($sSym)
; $sSym=ChrW(640)
; $sSymLow=StringUpper($sSym)
If $sSym=$sSymLow Then
  MsgBox(4096,"","Равны без учёта регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
Else
  MsgBox(4096,"","Не равны без учёта регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
EndIf

If $sSym==$sSymLow Then
  MsgBox(4096,"","Равны с учётом регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
Else
  MsgBox(4096,"","Не равны с учётом регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
EndIf

If 0=StringCompare($sSym,$sSymLow)Then
  MsgBox(4096,"","Равны без учёта регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
Else
  MsgBox(4096,"","Не равны без учёта регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
EndIf

If 0=StringCompare($sSym,$sSymLow,1) Then
  MsgBox(4096,"","Равны с учётом регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
Else
  MsgBox(4096,"","Не равны с учётом регистра"&@CRLF&"$sSym =>"&$sSym&"<="&@CRLF&"$sSymLow =>"&$sSymLow&"<=")
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,740
Репутация
1,360
Andrey_A
Преобразуйте обе строки к одному регистру и сравнивайте
Код:
$s1 = "TeSt" & ChrW(422) & "ПрОвЕрКа"
$s2 = "tEsT" & ChrW(640) & "пРоВеРкА"

ConsoleWrite( StringUpper($s1) = StringUpper($s2) )
ConsoleWrite(@CRLF)
ConsoleWrite( StringCompare(StringLower($s1), StringLower($s2)) )
ConsoleWrite(@CRLF)
 

Andrey_A

Осваивающий
Сообщения
213
Репутация
42
Обнаружил такой баг, нужен диапазон чисел с плавающей точкой, но с какого-то момента начинает появляться числа типа 2.23999999999999
Кто-то сталкивался? Можно ли просто это решить или надо писать свой обходной путь?


Код:
#include <Array.au3>
$sLine=''
For $i=2 To 3 Step 0.01
  $sLine&=$i&'|'
Next
$aArray=StringSplit($sLine,'|')
_ArrayDisplay($aArray,"Массив $aArray с появлением чисел 2.23999999999999")
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Это не связано с For ... Next ... Step как кажется на первый взгляд, это что то с переменными...
Код:
$i = 2

While $i < 3
    $i += 0.01
   
    If $i == 2.23 Then ;If $i = 2.23 Then тут не сработает
        ConsoleWrite($i + 0.01 & @CRLF)
        ConsoleWrite(2.23 + 0.01 & @CRLF)
    EndIf
WEnd


и это проявляется во всех версиях..
 

Alecsis

Осваивающий
Сообщения
63
Репутация
27
Это не связано с For ... Next ... Step как кажется на первый взгляд, это что то с переменными...
Логично. Это накапливаются ошибки округления в операциях с плавающей точкой и «в лоб» не лечится.
Разве что уползти обходным путём, используя integer, например, так:

Код:
#include <Array.au3>
$sLine=''
For $i=200 To 300 Step 1
  $sLine &= ($i/100) & '|'
Next
$aArray=StringSplit($sLine,'|')
_ArrayDisplay($aArray,"Массив $aArray без накопления ошибок округления")

Конечно, не выход, а выходка… из разряда «без шашечек, зато едем» :acute:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Ещё вариант решения:
Код:
#include <Array.au3>

$i = 2
$sLine = $i

While $i < 3
    $i = String($i) + 0.01
    $sLine &= '|' & $i
WEnd

$aArray = StringSplit($sLine, '|')
_ArrayDisplay($aArray, "Массив $aArray без накопления ошибок округления")
 

Andrey_A

Осваивающий
Сообщения
213
Репутация
42
Странное поведение функции GUICtrlCreatePic в бете AutoIt 3.3.15.3
Она перестала реагировать на GUICtrlSetResizing, GUICtrlSetPos и ряд других функций, перестало растягивать изображение ранее созданное, на бете 3.3.15.1 было ещё все хорошо, может кто передаст на офф форум...

Вот 2 примера:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
HotKeySet('{ESC}', '_exit')
Global $Form1 = GUICreate('Form1', 300, 200, -1, -1,$WS_SIZEBOX)
Global $spic = 'test.jpg'
$aPos1=WinGetClientSize($Form1)
Global $PIC = GUICtrlCreatePic($spic, 0, 0, $aPos1[0], $aPos1[1])
GUICtrlSetResizing(-1,2+4+32+64)
GUISetState()

While 1
    Sleep(10)
WEnd

Func _exit()
    Exit
EndFunc


Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

HotKeySet('{ESC}', '_exit')
Global $Form1 = GUICreate('Form1', 300, 200, -1, -1,$WS_SIZEBOX)
Global $spic = 'test.jpg'
$aPos1=WinGetClientSize($Form1)
Global $PIC = GUICtrlCreatePic($spic, 0, 0, $aPos1[0], $aPos1[1])
; GUICtrlSetResizing(-1,2+4+32+64)
GUISetState()

While 1
  $aPos=WinGetClientSize($Form1)
  If $aPos[0]<>$aPos1[0] Or $aPos[1]<>$aPos1[1] Then
    GUICtrlSetPos($PIC,0, 0, $aPos[0], $aPos[1])
    $aPos1=$aPos
  EndIf
    Sleep(10)
WEnd

Func _exit()
    Exit
EndFunc
 

Andrey_A

Осваивающий
Сообщения
213
Репутация
42
В новой бета версии 3.3.15.5 возникла странная проблема в функции StringRegExp
Тестовый файл http://tc-image.3dn.ru/Files/Autoit/0/sisinfo.zip
Не разбивает список в массив - пока буду откатываться обратно...
Передайте пожалуйста разработчикам. Думаю регулярку лучше не трогать))

Код:
#include <Array.au3>
$sFile='D:\sisinfo.txt'
$sText=FileRead($sFile)
$aRet=StringRegExp($sText,'(?m)^([^\r\n]?.*)',3) ; разбивка списка в массив
_ArrayDisplay($aRet,'Массив $aRet')


autoit_beta55.png
 

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
проблема в функции StringRegExp
(?m)^([^\r\n]?.*)
флаг (?m) подразумевает, что ^ использует от начала строки и далее чтобы ни было поиск не перейдёт на следующую строку, так точка не включает знак \n, но не исключает захват \r, в итоге захватив \r являющемся в Windows переносом строки (попробуйте в диалоговом сообщении использовать CR или LF и всегда бедут перенос строки). Но по умолчания в версиях после 3.3.8.1 был включен флаг что перенос строки любой из символов \r или \n это поломало все старые скрипты. Теперь могу предположить что авторы вернули старый вариант - конец строки только \n из-за чего был захвачен \r и выдал в список последнюю пустую строку.
Я бы сделал рег выр надёжней, например (?m)^(.+)\r?$ это подразумевает что захватываемый текст от начала до конца строки, в него не входит \r есть он или нет его и что текст обязательно должен иметь хотя бы один символ.
 

Andrey_A

Осваивающий
Сообщения
213
Репутация
42
AZJIO, я уважаю Ваш труд в развитии Autoit, всё что вы описали прекрасно понимаю.
От Пользователей моей программы TCIMG стали поступать сообщения о неработоспособности различных регулярных выражений после обновления на новую бету...
----
Я понимаю когда исправляются явные ошибки/баги в функциях, но менять "на лету" то что работало годами, и когда созданы у многих шаблоны рег.выр. - это отбивает охоту обновляться...
---
Всегда можно найти объяснение того или иного. AZJIO, Вы за то, чтобы разработчики каждый раз меняли отношение к тому, что все привыкли?
---
Попробую сам достучаться до разработчиков...
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168

Andrey_A

А у меня 4 UDF были поломаны нововведениями и разбираться мне было лень, проще пользоваться старой, вот теперь можно проверить восстановлен ли функционал (поиск файлов, разбор ini-файла, сохранение настроек reg/ini).
Сообщение автоматически объединено:

Andrey_A

Добавь (*LF) в начало каждого регулярного выражения, скрыто, то есть прочитал рег.выр., с поля ввода, добавил флаг (*LF) в начало. А вообще известный факт, по возможности бетку не использовать в проектах, исключение если в этой бетке решена какая нибудь проблема, которая важна для вашей программы.

.
 
Последнее редактирование:

Andrey_A

Осваивающий
Сообщения
213
Репутация
42
Вышла новая версия Autoit 3.3.16.0, но ещё в предыдущих заметил такой баг - может кто-то сталкивался:
Определение макросов @OSVersion и @OSBuild
Думал зависит от версии, ан нет- а от чего-то ещё
При нескомпилированном скрипте показывает все отлично на Windows10:

Autoit_au3.png


При скопилированном:

Autoit_exe.png


Почему так происходит я долго не мог понять, т.к. мой основной скрипт TCIMG 55.000 строк, но получилось создать пример для выявления проблемы...

При компиляции участвуют файлы Obfuscator.exe и AutoIt3Wrapper.exe
(другие варианты рассматривал, но все остальное выдают ошибки при тернарных условиях и в других случаях сложных функциях)

Вот архив со всем, что касается проблемы:


Сам скрипт (обрезанный до минимума):

Код:
#Region
#AutoIt3Wrapper_Outfile=Name.exe
#AutoIt3Wrapper_OutFile_X64=Name64.exe
#AutoIt3Wrapper_Compile_both=Y
#AutoIt3Wrapper_Icon=Name.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Icon_Add=App.ico
#AutoIt3Wrapper_Res_Comment=Name
#AutoIt4Wrapper_Res_Description=Name
#AutoIt3Wrapper_Res_Fileversion=30.5.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=Copyright (c)
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Res_Compatibility=Vista,Windows7,Windows8,Windows10,Windows11
#AutoIt3Wrapper_Run_Au3check=n
#AutoIt3Wrapper_Res_Field=Version|30.5.0.0
#AutoIt3Wrapper_Res_Field=Build|%date%
#AutoIt3Wrapper_Res_Field=PrivateBuild|
#AutoIt3Wrapper_Res_Field=Coded by|Averin Andrey
#AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
#AutoIt3Wrapper_Res_Field=CompanyName|AAA
#AutoIt3Wrapper_Res_Field=InternalName|Name.exe
#AutoIt3Wrapper_Res_Field=OriginalFilename|Name.exe
#AutoIt3Wrapper_Res_Field=CompiledScript|%AutoItVer%
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, Icon, 162,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, Icon, 164,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, Icon, 169,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, Stringtable,7,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, Stringtable,8,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, Stringtable,9,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, stringtable,10,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, stringtable,11,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, stringtable,12,
#AutoIt3Wrapper_Run_After=ResHacker.exe -delete %out%, %out%, stringtable,313,
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0 /sci=0
#EndRegion#NoTrayIcon
#Obfuscator_Off
#Pragma compile(AutoItExecuteAllowed,True)
#Obfuscator_On
[email protected]
[email protected]
MsgBox(4096,'Result','$sOSV =>'&$sOSV&'<='&@CRLF&'$sOSB =>'&$sOSB&'<=')


Что не так? От чего разные результаты?
Сообщение автоматически объединено:

Выяснил, всё дело в строке
Код:
#AutoIt3Wrapper_Res_Compatibility=Vista,Windows7,

В командной строке Aut2exe.exe есть [/compatibility <vista | win7 | win8>] - это и влияет на определение макросов @OSVersion и @OSBuild
Т.е. Aut2exe.exe записывает в манифест при /compatibility , то что на WIN10, WIN11 не работает
Я просто удалил эту запись, но все же это надо поправить авторам AutoIt...
 
Последнее редактирование:
  • Like
Реакции: Oki
Верх