Что нового

[Баг] Забавный баг(?) при выводе в консоль в SciTE

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
Открываем SciTE, и запускаем (F5) такой скрипт:

Код:
$sVal = StringToBinary("Hello!")

MsgBox(64, 'Title', $sVal)
ConsoleWrite(VarGetType($sVal) & ":" & $sVal & @CRLF)
ConsoleWrite($sVal)


в MsgBox всё выводится как надо (в бинарном виде), в первом ConsoleWrite тоже (обратите внимание на различия), а вот во втором выводится не в бинарном виде, а в оригинале :smile:. Получается что если использовать переменную (и только её одну) содержащую строку в бинарном виде, то строка как бы конвертируется обратно. Стоит лишь добавить @CRLF после $sVal и будет отображать в бинарном виде, как и должно быть.

P.S
Прошу подтвердить :whistle:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Подтверждаю :beer:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 499
Репутация
317
И я подтверждаю. И правда забавно :D
 

SyDr

Сидра
Сообщения
651
Репутация
158
Ага, блин, забавный :-X Всё из-за того, что только один тип данных. А если мне с 0x1237823534 надо работать исключительно, как со строкой? как мне объяснить AutoIt'у, что это строка, а не бинарное значение?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622

amel27

Продвинутый
Сообщения
146
Репутация
55
это не баг, а фича... и эта фича называется тип данных "Variant"

Код:
$sVal = StringToBinary("Hello!")

ConsoleWrite(BinaryToString($sVal) &@CRLF)
ConsoleWrite(String($sVal) &@CRLF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
А где интересно граница между багом и фичей?

:smile:

Код:
$sVal = StringToBinary("Hello!")

ConsoleWrite(IsBinary($sVal) & @CR)
ConsoleWrite($sVal)
ConsoleWrite(' - ???' & @CR)
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Оператор "&" преобразует бинарные данные по типу String(), ConsoleWrite - по типу BinaryToString()... Если поведение "&" еще можно оспаривать, то работа ConsoleWrite как раз никаких нареканий не вызывает, т.к. основное ее предназначение не SciTE, а консольные приложения... и алгоритм ConsoleWrite должен четко соответствовать ConsoleRead.

З.Ы. достаточно скомпилировать скрипт в консольный EXE, чтобы убедиться, что SciTE тут не причем
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Так вот на мой взгляд "&" должен делать ConsoleWrite() самостоятельно, а то логика нарушается.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Yashied сказал(а):
"&" должен делать ConsoleWrite() самостоятельно
не понял - обе команды вынуждены сначала привести входные данные к типу "String", вот только каждая делает это по своему... таких команд в AutoIT много, все "нагружать" дополнительным выводом в консоль?

Код:
$sVal = StringToBinary("Hello!")

ConsoleWrite(IsBinary($sVal &@CRLF) &@CRLF)
ConsoleWrite(IsBinary($sVal)&@CRLF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Логика в том, что если переменная - Binary, то я ожидаю при выводе в консоль увидеть ее двоичное представление, независимо от наличия или отсутствия символа "&". Если переменная имеет строковый тип - строку и т.д. Как, например, в реестре...

Код:
$sStr = '0x'
For $i = 1 To 10
	$sStr &= Hex(Random(0, 255, 1), 2)
Next
$sVal = Binary($sStr)
ConsoleWrite(IsBinary($sVal) & @CR)
ConsoleWrite($sStr & @CR)
ConsoleWrite($sVal)
ConsoleWrite(' <= :(((' & @CR & $sVal & @CR)
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Yashied сказал(а):
я ожидаю при выводе в консоль увидеть ее двоичное представление
а я ожидаю, что формат данных не изменится
;)

Код:
While True
	$bin = ConsoleRead(False, True)
	If @error Then ExitLoop
	Sleep(25)
	ConsoleWrite($bin)
WEnd
 
Верх