Автокликер Clickermann :: Форум
Основной раздел => Ошибки => Архив => Topic started by: Vint on December 03, 2012, 11:56:45 AM
-
По поводу нововведения в 4.7...
Строковые переменные убрали, ну и ладушки.
Вот теперь столкнулся с косяком на старом скрипте.
Скрипт считывает данные с полей мозилы, записывает их в файл, затем вставляет из файла в определённом порядке.
Споткнулся на номерах телефонов (мобильных), теперь при помещении их из буфера обмена
через переменную он тупо из номера телефона высчитывает результат.
$a = FROMCLIP()
STRWRITELN ("file_teplovoi.txt", $a)
Я конечно в данном случае заменил на прямую запись
STRWRITELN ("file_DT.txt", FROMCLIP())
А если STRWRITELN будет "многоэтажным" со всякими объединениями строки, потянет?
Даже если потянет очень нечитаемо выйдет.
Пример:
TOCLIP ("target.txt", (STRCONCAT(StrReadln("file.txt", 3), StrReadln("file.txt", 4), StrReadln("file.txt", 5))))
Во блин, и я не уверен, что правильно написал и скобки посчитал.
Может сделать разделение на FROMCLIP() и например FROMCLIP("")
и TOCLIP туда же. Чтоб можно было присваивать переменным в строковом виде.
Или подскажите что делать.
-
Ну это определенно баг.
Точные детали реализации я у Джонни не знаю, но нужно как-то разделить парсинг выражений и типы переменных.
Сейчас вроде все соединяется в одну строку, которая после этого парсится как выражение. Это хорошо работает для чисел, но когда появляются ещё и строки, надо придумывать что-то другое.
-
просто сейчас парсер пытается вычислить строку. если это ему удается то он это делает. если нет, он говорит "видимо и правда строка" и оставляет как есть.
конечно это недоработка. в процессе решения.
вводить явную типизацию (префиксами или вообще типами int / float / string) совсем не хочется.
-
Типизация не обязательно должна быть явной, можно решить эту проблему ничего не меняя в самом языке.
Вот отличная статейка на эту тему: http://habrahabr.ru/post/161205/
Вообщем я думаю надо ввести эти типы в интерпретаторе, но не в самом синтаксисе.
P.S. Кстати у кликермана типизация динамическая неявная сильная
-
Да, вот такая штука выглядит забавно
$a="привет"
INC($a)
Это ожидаемо... А вот это не ожидаемо
$a="8-10"
LOGWRITE("$a:", $a)
INC($a)
LOGWRITE("$a:", $a)
HALT
Т.е. он переменную вычисляет, хоть она задана как строковая, но в то, же время он помнит, что она строковая и INC() не работает.
-
В новой, только что вышедшей, версии это пофиксили. Работает, если привести в порядок код так:
$a=8-10
LOGWRITE("a:", $a)
INC($a)
LOGWRITE("a:", $a)
HALT
-
Обкатываю 4,7 SE .
Встал перед дилеммой, или вернуться на 4.7 , или перелопачивать все скрипты.
Суть в том, что ранее ( 100% рабочий ) скрипт из определённых зон (* посторонней проги, которую я кликерманил ) вытаскивал нужные цифры простым "копипаст" ( через кликер ). Присваивал скопированые значения переменным. Выполнял мат_действие и принимал решение.
Сейчас все встало и не пашет.
Анализ показал, что цифры копируются некорректно.
Пока в части скрипта вопрос решился введением оператора INT
SUB(PROV)
DEFINE($deldel_4, 0)
DEFINE($deldel_5, 0)
DEFINE($deldel_6, 0)
DBLCLICK(838,268) // 1 цифра второй страницы
waitms(250)
GOSUB(copi)
waitms(150)
$deldel_4 = FROMCLIP ()
waitms(150)
print("разница-", $deldel_4)
DBLCLICK(794,268) // 2 цифра второй страницы
waitms(rnd(250,300))
GOSUB(copi)
waitms(150)
$deldel_5 = FROMCLIP ()
waitms(250)
print("разница-", $deldel_5)
$deldel_6 = (INT ($deldel_4) - INT($deldel_5))
waitms(150)
print("разница-", $deldel_6)
waitms(50)
If ($deldel_6 = 0 )
print("2 цифры равны")
wait(1)
GOTO (finfin)
else
print("2 цифры неравны")
GOTO(ttt)
end_if
END_SUB
SUB(copi)
KEYDOWN(17)
waitms(150)
KEYDOWN(67)
waitms(150)
KEYUP(67)
waitms(150)
KEYUP(17)
waitms(150)
END_SUB
Пара вопросов.
Баг ли это , или я по простоте чайника чего-то не понимаю?
Какие рекомендации корифеи посоветуют любителям ?
-
Да, теперь неявные преобразования типов не выполняются из за смены алгоритма выполнения выражений.
Насчет DEFINE - по-идее это баг, т.к. явно задается число, а не строка и никаких дополнительных преобразований не нужно.
В качестве временного решения можно юзать INT.
-
В качестве временного решения можно юзать INT.
хмм..
DEFINE($dount, 0)
DEFINE($dount2, 0)
DEFINE($dou_list, 0)
DEFINE($_dretu0, 0)
DEFINE($_dretu1, 0)
TOCLIP("0")
WAITMS(50)
dgo1:
IF($dount < $doudop ) // если счет > $doudop к go2
WAITMS(50)
GETSCREEN
COLORMODE(0)
WAITMS(750)
ELSE
GOTO(dgo2)
END_IF
///////////////
IF_PIXEL_IN(721,100,729,763, 3355443 ) // показываем какой нас интересует пиксель
WAITMS(50)
LCLICK($_return1, $_return2) // добавляем
WAITMS(RND(100,150))
MOVE ($_return1+50,$_return2+30) // отводим в сторону курсор
WAITMS(RND(100,150))
$_dretu0 = FROMCLIP () // задаем значение переменой из FROMCLIP
WAITMS(50)
$_dretu1 = ($_return1+$_return2) // сумма кор
WAITMS(50)
TOCLIP ($_dretu1) // в TOCLIP новую переменную
WAITMS(50)
$dou_list = 0 // если был пиксель, обнуляем переменную листания экрана
WAITMS(50)
IF (( $_dretu1 - $_dretu0) > 5) // если > 5 считаем
WAITMS(50)
INC($dount) // добавляем счет
ELSE
INC($dount2) // если < 5 добавляем счет в ложные
IF ($dount2 > 10) // если ложных > 10 топаем к dgo2
GOTO(dgo2)
END_IF
END_IF
$_dretu0 = FROMCLIP ()
TOCLIP ($_dretu1)
IF (( $_dretu1 - $_dretu0) > 5)
Аналогичная ошибка возникает, если загнать в буфер переменную, а потом её извлечь.( синяя подсветка)
Скрипт останавливается и на экране красным выводится строка ( тут подсвечена красным) .
Кто-то может подсказать скриптик, который откорректирует скрипты 4.7 к 4.7 SE ?
-
Аналогичная ошибка возникает, если загнать в буфер переменную, а потом её извлечь.( синяя подсветка)
Скрипт останавливается и на экране красным выводится строка ( тут подсвечена красным) .
Не получается повторить.
Вот всё нормально:
TOCLIP (3)
$_b = FROMCLIP ()
IF (($b-1) < 5)
HINTPOPUP("Всё нормально")
END_IF
А в твоём примере не хватает одного END_IF
P.S.
А, да... не нормально. Ну ничего.
TOCLIP ("9")
$_b = FROMCLIP ()
IF (($b-1) < 5)
$f=$b-1
LOGWRITE ($f)
END_IF
А в твоём примере вообще TOCLIP нафиг не нужен, ты буфер используешь как переменную.
-
Ну... как умею так и пишу) Университетов мы не кончали. Растем от макросов в эксель.
Дело в том , что анализирую изменения экрана в одной из точек Х, при условии что спусковой механизм изменения экрана, передвигается прямо по линии У , но как-то уж очень произвольно.( не нашел закономерностей)
Отсюда пришлось писать
// TOCLIP ($_dretu1) // в TOCLIP новую переменную//
а на следующем цикле сравнивать её с вновь полученной
// IF (( $_dretu1 - $_dretu0) > 5)// .
Выражение TOCLIP ("0") очищало буфер от цифр которые вдруг могли бы там остаться.
В версии 4.7 все работало справно, а 4.7се нужно во все фромклипы внедрять int.
-
Ты проще введи ещё одну переменную вместо своих токлипов, чего экономить, особенно теперь :)
И хоть обнуляй её, хоть зануляй...
Всё равно ведь INT добавлять нужно будет.
-
Ты проще введи ещё одну переменную вместо своих токлипов, чего экономить,
Когда писал в режиме "что_вижу_то_пою", казалось туклип\фромклип , - это самое то что нужно. 8)
А сейчас...десяток скриптов по 1300 строк переделывать влом :o
Все равно, без INT пока никак. :)