Что нового

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

Andrey_A

Осваивающий
Сообщения
153
Репутация
27
Обнаружил такой баг, попался намедни текст, который никак не хотел сравниваться, ни "=", ни "==", ни 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,597
Репутация
1,290
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

Осваивающий
Сообщения
153
Репутация
27
Обнаружил такой баг, нужен диапазон чисел с плавающей точкой, но с какого-то момента начинает появляться числа типа 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,669
Репутация
2,463
Это не связано с 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

Осваивающий
Сообщения
39
Репутация
20
Это не связано с 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,669
Репутация
2,463
Ещё вариант решения:
Код:
#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

Осваивающий
Сообщения
153
Репутация
27
Странное поведение функции 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
 
Верх