Что нового

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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ну да, тем более что написано что если в файле только символы с 1 по 255, что явно наш случай с 12345(кодировка скрипта Ansi), то должна возвращать $FO_ANSI
Files containing only characters 1-255 are opened in ANSI ($FO_ANSI) mode by default.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Проверьте, пожалуйста, кто нибудь этот код:
Код:
#include 'FileConstants.au3'


$h = FileOpen('test.txt', $FO_OVERWRITE + $FO_UTF8_NOBOM)
FileWrite($h, 'ddddddddddddd')
FileClose($h)

$h = FileOpen('test.txt', $FO_READ + $FO_UTF8_NOBOM)
$data = FileRead($h)
FileClose($h)

If IsBinary($data) Then
	MsgBox(0,'','WAT?')
EndIf


на версии 3.3.13.19

У меня почему то возвращаются бинарные данные, если файл в кодировке UTF-8, это у меня такой глюк или это бета так чудит?
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
3.3.12.0 - все нормально. Может там константы поменяли нечаянно? Просто такое ощущение, что у тебя в FileOpen вторым параметром 16 получается. А справка гласит, что при моде=16 файл принудительно открывается как бинарный. Проверь, чем черт не шутит эти две константы $FO_READ & $FO_UTF8_NOBOM. У меня 0 и 256.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
inververs [?]
или это бета так чудит?
Похоже, что бета
Код:
#include 'FileConstants.au3'

$h = FileOpen('test.txt', $FO_OVERWRITE + $FO_UTF8_NOBOM)
FileWrite($h, 'ddddddddddddd')
FileClose($h)

test(0)
test($FO_BINARY)
test($FO_UTF16_LE)
test($FO_UTF16_BE)
test($FO_UTF8)
test($FO_UTF8_NOBOM)
test($FO_UTF8_FULL)

Func test($FO)
  $h = FileOpen('test.txt', $FO_READ + $FO)
  $data = FileRead($h)
  FileClose($h)
  ConsoleWrite($data & @CRLF)
EndFunc
Консоль 3.3.10.2
Код:
ddddddddddddd
0x64646464646464646464646464
??????
??????
ddddddddddddd
ddddddddddddd
ddddddddddddd
Консоль 3.3.13.19 beta
Код:
ddddddddddddd
0x64646464646464646464646464
0x6464646464646464646464
0x6464646464646464646464
0x64646464646464646464
0x64646464646464646464646464
ddddddddddddd
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
Спросить бы о подобном поведении беты на официальном форуме. Может это очередная ошибка.
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Всем доброго времени. Хочу сообщить не о баге, а о большой, на мой взгляд неточности.
Меня смутила запись в справке:
Note: A maximum of 63 parameters can be returned by the array $CmdLine[]. If you would like to see the entire commandline string passed to an AutoIt executable, then use $CmdLineRaw for the entire parameter string.
Примечание: массив $CmdLine[...] может вернуть не более 63 параметров, а $CmdLineRaw всегда возвращает полную строку параметров.
Создал 2 скрипта: Из первого вызываю 2-й с параметрами:
Код:
$sParam=''
For $i=1 To 3377
  $sParam&=' param'&$i
Next
$sLen=StringLen($sParam) ; 32663 символа
MsgBox(4096,"Переменная ","$sLen =>" & $sLen & "<=")
Run('"D:\TC IMAGE\Utilities\Scripting\AutoIt\AutoIt3.exe" /AutoIt3ExecuteScript "'&@ScriptDir&'\TEST.au3"'&$sParam)


2-й скрипт TEST.au3 принимает:
Код:
#include <Array.au3>
_ArrayDisplay($CmdLine)


Тестовым путём достиг цифры 3377
И оказывается, что передача параметров не зависит от количества, а зависит от длины общей командной строки (примерно 32663 символов, или в сумме близко к 32767), т.е массив $CmdLine[...] никак не ограничен 63-мя параметрами.
Или нет?





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

Ещё из справки:
$CmdLine является константой и не доступен для изменения размерности или параметров полученных при запуске скрипта.
Код:
#include <Array.au3>
_ArrayDisplay($CmdLine)
$CmdLine[1]='привет'
_ArrayDisplay($CmdLine)

Может это конечно в ранних версиях был не доступен...
 

Skif_off

Знающий
Сообщения
173
Репутация
12
В в справке и в au3.api есть функции
MapAppend(),
MapExists(),
MapKeys(),
MapRemove(),
но их нет в истории, кто-нибудь может по-русски пояснить что за функции и для чего?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Для работы с map
Создается так: local $bla[]
Используется так: 
$bla.ab = 111
или так
$bla['ac'] = 222
доступ такой:
ConsoleWrite($bla.ab & @CRLF)
ConsoleWrite($bla['ac'] & @CRLF)
 

Skif_off

Знающий
Сообщения
173
Репутация
12
inververs
Я понял, что для работы с map, но что такое "map"?
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Skif_off
Посмотри в справке Scripting.Dictionary, очень похоже, словарь или ассоциативный массив.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Опять эти мелочные изменения... Из-за них пришлось проводить достаточно осложненную отладку.

Код:
Local $aTest[2] = [ 1, 2 ]
$vRet = Execute( $aTest )

;3.3.8.1 - Return Array ($aTest)
;3.3.12.0 - Return "" (Empty string)
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
firex
я не понял о каком изменении речь?
3.3.8.1
Успех: Возвращает значение выполненного выражения.
Ошибка: Возвращает "" (пустая строка) и устанавливает значение @error не равным 0.
3.3.12.0
Success: the value of the evaluated expression.
Failure: "" (empty string) and sets the @error flag to non-zero.
3.3.13.19
Success: the value of the evaluated expression.
Failure: "" (empty string) and sets the @error flag to non-zero.
в чем разница?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
joiner
Не обращай внимания, это все моя невнимательность.

Проблема кроется в другом, в новых версиях опция TCPTimeout влияет на поведение функции TCPRecv; т.е. она повесит скрипт пока не получит данные / пройдет N ms.
Что мы теперь имеем:
TCPTimeout = 0: Проблематично словить падение одной из сторон, а именно ( в моем случае ) стороны могут продолжительное время молчать. Организовывать ECHO на AutoIt( с десятками клиентов ) вручную - нет ни единого желания.
TCPTimeot > 0: Вешаем скрипт.

Конкретно я сказать не могу где именно они начудили, однако:
1) TCPRecv вешает скрипт.
2) При отключенном таймауте TCPRecv работает как прежде.
3) При любом значении TCPTimeout - TCPRecv не возвращает ошибку при падении клиента.

Раньше за 3 пункт отвечала ошибка -1, однако теперь это "Отсутствие полученных данных"( и не смотрите в справку AutoIt'а, она в этом плане недокументированна ).

Нововведения, блин. Придется писать собственную альтернативу TCP* функциям.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Кто-нибудь, добавьте, плиз в https://www.autoitscript.com/trac/autoit/ticket/2915 комментарий

A better example (eats memory pretty quickly):

{{{
HotKeySet("{F1}", "Quit")

Global $Map = MapEmpty()

While True
For $i = 1 To 100
$Map[$i & "test"] = MapEmpty()
For $j = 1 To 100
$Map[$i & "test"][$j & "test"] = Random() > 0.5 ? True : False
Next
Next
WEnd

Func MapEmpty()
Local $mMap[]
Return $mMap
EndFunc

Func Quit()
Exit
EndFunc

}}}
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Наверняка не знаю начиная с какой версии творится это безобразие...

В чем смысл этих конструкций? (некоторые UDF)
Код:
If @error Then Return SetError(@error, @extended, 0)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
firex [?]
В чем смысл этих конструкций?
@error - понятно, DllCall вернула ошибку, а с @extended я как-то экспериментировал, но, как я не издевался над dll, флаг @extended не равный 0 мне получить не удалось. :smile:
 
Верх