Author Topic: Объединение строковых и численных переменных  (Read 12113 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
По поводу нововведения в 4.7...
Строковые переменные убрали, ну и ладушки.
Вот теперь столкнулся с косяком на старом скрипте.
Скрипт считывает данные с полей мозилы, записывает их в файл, затем вставляет из файла в определённом порядке.
Споткнулся на номерах телефонов (мобильных), теперь при помещении их из буфера обмена
через переменную он тупо из номера телефона высчитывает результат.
Code: (clickermann) [Select]
$a = FROMCLIP()
STRWRITELN ("file_teplovoi.txt", $a)

Я конечно в данном случае заменил на прямую запись
Code: (clickermann) [Select]
STRWRITELN ("file_DT.txt", FROMCLIP())А если STRWRITELN будет "многоэтажным" со всякими объединениями строки, потянет?
Даже если потянет очень нечитаемо выйдет.
Пример:

Code: (clickermann) [Select]
TOCLIP ("target.txt", (STRCONCAT(StrReadln("file.txt", 3), StrReadln("file.txt", 4), StrReadln("file.txt", 5))))Во блин, и я не уверен, что правильно написал и скобки посчитал.

Может сделать разделение на FROMCLIP() и например FROMCLIP("")
и TOCLIP туда же. Чтоб можно было присваивать переменным в строковом виде.

Или подскажите что делать.
« Last Edit: December 03, 2012, 12:02:44 PM by Vint »


Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Ну это определенно баг.
Точные детали реализации я у Джонни не знаю, но нужно как-то разделить парсинг выражений и типы переменных.
Сейчас вроде все соединяется в одну строку, которая после этого парсится как выражение. Это хорошо работает для чисел, но когда появляются ещё и строки, надо придумывать что-то другое.
Отсутствую.

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
просто сейчас парсер пытается вычислить строку. если это ему удается то он это делает. если нет, он говорит "видимо и правда строка" и оставляет как есть.
конечно это недоработка. в процессе решения.
вводить явную типизацию (префиксами или вообще типами int / float / string) совсем не хочется.

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Типизация не обязательно должна быть явной, можно решить эту проблему ничего не меняя в самом языке.
Вот отличная статейка на эту тему: http://habrahabr.ru/post/161205/
Вообщем я думаю надо ввести эти типы в интерпретаторе, но не в самом синтаксисе.
P.S. Кстати у кликермана типизация динамическая неявная сильная
« Last Edit: December 07, 2012, 12:15:41 AM by Сергей »
Отсутствую.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Да, вот такая штука выглядит забавно
Code: (clickermann) [Select]
$a="привет"
INC($a)
   

Это ожидаемо... А вот это не ожидаемо
Code: (clickermann) [Select]
$a="8-10"
LOGWRITE("$a:", $a)
INC($a)
LOGWRITE("$a:", $a)
HALT

Т.е. он переменную вычисляет, хоть она задана как строковая, но в то, же время он помнит, что она строковая и INC() не работает.


Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
В новой, только что вышедшей, версии это пофиксили. Работает, если привести в порядок код так:
Code: (clickermann) [Select]
$a=8-10
LOGWRITE("a:", $a)
INC($a)
LOGWRITE("a:", $a)
HALT
Отсутствую.

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Обкатываю 4,7 SE .
 Встал перед дилеммой, или вернуться на 4.7 , или перелопачивать все скрипты.
Суть в том, что ранее ( 100% рабочий )  скрипт из определённых зон  (* посторонней  проги, которую я кликерманил ) вытаскивал нужные цифры  простым "копипаст" ( через кликер ).  Присваивал скопированые значения переменным.  Выполнял мат_действие и принимал решение. 
  Сейчас все встало и не пашет.
  Анализ  показал, что цифры копируются некорректно. 
Пока в части скрипта вопрос решился введением оператора INT

Code: (clickermann) [Select]

 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 
 

Пара вопросов.
Баг ли это , или я по простоте чайника чего-то не понимаю?
Какие рекомендации корифеи  посоветуют любителям ?
Бабочки полёт будит тихую поляну в солнечном свету...

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Да, теперь неявные преобразования типов не выполняются из за смены алгоритма выполнения выражений.
Насчет DEFINE - по-идее это баг, т.к. явно задается число, а не строка и никаких дополнительных преобразований не нужно.
В качестве временного решения можно юзать INT.
Отсутствую.

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
В качестве временного решения можно юзать INT.
хмм..
Code: (clickermann) [Select]
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 ?
« Last Edit: December 10, 2012, 10:00:08 AM by ЦИТРИН »
Бабочки полёт будит тихую поляну в солнечном свету...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Аналогичная ошибка возникает, если загнать  в буфер  переменную, а потом её  извлечь.( синяя подсветка)
 Скрипт останавливается и на экране красным выводится строка ( тут подсвечена красным) .

Не получается повторить.
Вот всё нормально:
Code: (clickermann) [Select]
TOCLIP (3)
$_b = FROMCLIP ()
IF (($b-1) < 5)   
   HINTPOPUP("Всё нормально")
END_IF

А в твоём примере не хватает одного END_IF

P.S.
А, да... не нормально. Ну ничего.
Code: (clickermann) [Select]
TOCLIP ("9")
$_b = FROMCLIP ()
IF (($b-1) < 5)
   $f=$b-1
   LOGWRITE ($f)   
END_IF

А в твоём примере вообще TOCLIP нафиг не нужен, ты буфер используешь как переменную.
« Last Edit: December 10, 2012, 02:04:43 PM by Vint »


ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Ну... как умею так и пишу) Университетов  мы не кончали. Растем  от макросов в эксель.
Дело в том , что  анализирую изменения экрана в одной из точек Х, при условии что  спусковой механизм изменения экрана,  передвигается  прямо по  линии У , но  как-то уж очень произвольно.( не нашел закономерностей)
Отсюда  пришлось писать
// TOCLIP ($_dretu1) // в TOCLIP новую переменную//
 а на следующем цикле сравнивать   её с вновь полученной
 // IF (( $_dretu1 - $_dretu0) > 5)// .
Выражение TOCLIP ("0") очищало буфер от цифр которые вдруг   могли бы  там остаться.
 В версии 4.7 все работало справно, а 4.7се  нужно во все фромклипы  внедрять int.
Бабочки полёт будит тихую поляну в солнечном свету...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ты проще введи ещё одну переменную вместо своих токлипов, чего экономить, особенно теперь :)
И хоть обнуляй её, хоть зануляй...
Всё равно ведь INT добавлять нужно будет.
« Last Edit: December 10, 2012, 02:51:06 PM by Vint »


ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Ты проще введи ещё одну переменную вместо своих токлипов, чего экономить,
Когда писал в режиме "что_вижу_то_пою",  казалось   туклип\фромклип , -  это самое то что нужно.  8)
А сейчас...десяток скриптов по 1300 строк переделывать влом  :o
Все равно, без INT пока никак.  :)
Бабочки полёт будит тихую поляну в солнечном свету...