Author Topic: Ошибка после повторного запуска кода  (Read 2510 times)

0 Members and 1 Guest are viewing this topic.

mAramiXx

  • Освоившийся
  • **
  • Posts: 34
    • View Profile
Код считывает координаты точек, кликает по ним и выполняет некоторые действия.

Программа работает, но после каждого прохода(запуска с начала) выдает ошибку:
https://ibb.co/w4SYy01
https://ibb.co/yNj880b
(скриншоты)

Ломаю голову, не пойму в чем проблема.. Подскажите плз.. :-\

Вот код:
Code: (clickermann) [Select]
GETSCREEN   // POISK POSICIY    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SCANPXL($ARR_SCAN, 558,76, 639,760, 0)
$ARR_NUM = 0
$SHIFT_X = 72 // смещение (кол-во игнор пикселов после найденного)
$SHIFT_Y = 50
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   IF(($X > $X2) | ($Y > $Y2))
      $X2 = $X + $SHIFT_X
      $Y2 = $Y + $SHIFT_Y
      INC($SCAN_COUNT,1)
      TFWRITE("position.txt", ($X, $Y))
      WAITMS(50)
   END_IF
END_CYC
UNDEFINE($ARR_SCAN)
LOGWRITE ("=====================")
LOGWRITE ("Всего найдено: ", $SCAN_COUNT)

waitms(50)
$X = 0
$Y = 0
$check = 0  // KLICK PO POSICIY   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WHILE($check < $SCAN_COUNT)
   INC($position,1)
   $stroka = TFREAD("position.txt", $position)
   waitms(50)
   strseparate($stroka, ".", $arr)
   $X = $arr[0]
   $Y = $arr[1]
   UNDEFINE($arr)
   
   LCLICK($X, $Y) // KLICK PO POSICIY
   
   wait(1)
   
   GETSCREEN
   IF_PICTURE_IN (273,106, 1057,726, "sobaka.bmp")
      LCLICK($_return1+13, $_return2+3)
      waitms(50)
      LCLICK($_return1+13, $_return2+3)
      waitms(50)
     
      KEYDOWN (#CTRL)
      WAITMS (50)
      KEYPRESS (#C)
      KEYUP (#CTRL)
     
      $nik = FROMCLIP()
      TFWRITE("nik.txt", $nik)
     
      waitms(50)
     
      GETSCREEN
      IF_PICTURE_IN (750,78,905,754, "Close.bmp")
         LCLICK($_return1+4, $_return2+2)
         waitms(50)
      END_IF
   ELSE
      GETSCREEN
      IF_PICTURE_IN (750,78,905,754, "Close.bmp")
         LCLICK($_return1+4, $_return2+2)
         waitms(50)
      END_IF
   END_IF
   INC($check,1)
END_CYC

waitms(50)
TFCLEAR("position.txt", 0)
waitms(50)

move(643,421)  // v centr
waitms(50)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)

« Last Edit: December 29, 2020, 11:22:17 PM by mAramiXx »

mAramiXx

  • Освоившийся
  • **
  • Posts: 34
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #1 on: December 29, 2020, 11:16:33 PM »
Иногда дорабатывает до конца  и выдает ошибку. Иногда сразу после цикла while , даже не чистит файл и сразу ругается)

Думаю ошибка где-то тут. Возможно надо как-то считывать массив, но я в массивы не сильно умею :(

Code: (clickermann) [Select]
   INC($position,1)
   $stroka = TFREAD("position.txt", $position)
   waitms(50)
   strseparate($stroka, ".", $arr)
   $X = $arr[0]
   $Y = $arr[1]
   UNDEFINE($arr)
« Last Edit: December 29, 2020, 11:22:37 PM by mAramiXx »

mAramiXx

  • Освоившийся
  • **
  • Posts: 34
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #2 on: December 30, 2020, 12:08:23 AM »
Научился в массивы, переделал последний кусок кода. Всё равно ошибка)))) та за шооо

Скрин: https://ibb.co/d71qJH2

Code: (clickermann) [Select]
   INC($position,1)
   TFREADARR("position.txt", $arr)
   waitms(50)
   STRSEPARATE($arr[$position], ".", $arr1)
   $X = $arr1[0]
   $Y = $arr1[1]
   UNDEFINE($arr)
   UNDEFINE($arr1)
« Last Edit: December 30, 2020, 12:10:50 AM by mAramiXx »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #3 on: December 30, 2020, 12:19:54 AM »
 Основная ошибка, это попытка чтения не существующей строки TFREAD("position.txt", $position). После цикла нужно обнулять наращиваемую переменную $position.
 Но помимо этого, еще ошибки:
 $SCAN_COUNT тоже нужно обнулять.
 TFWRITE("position.txt", ($X, $Y)) - так писать нельзя. TFWRITE (file, str, [str_n] ), file - имя файла, str - строка, str_n - необязательный параметр; номер строки в файле. Если нужно записать координаты через запятую или другой разделитель, то правильно так - TFWRITE("position.txt", STRCONCAT ($X, ",", $Y)).
 А главное, запись в файл координаты это лишнее. Можно действовать сразу в первом же цикле без записи и последующего чтения файла.
 
,


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #4 on: December 30, 2020, 12:34:59 AM »
Еще ошибку нашел, $X2 и $Y2 тоже нужно обнулять перед первым циклом.

Вот примерно так должно все работать без записи в файл:

Code: (clickermann) [Select]
GETSCREEN   // POISK POSICIY    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SCANPXL($ARR_SCAN, 558,76, 639,760, 0)
$ARR_NUM = 0
$SHIFT_X = 72 // смещение (кол-во игнор пикселов после найденного)
$SHIFT_Y = 50
$X2 = 0
$Y2 = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   IF(($X > $X2) | ($Y > $Y2))
      $X2 = $X + $SHIFT_X
      $Y2 = $Y + $SHIFT_Y
     
      LCLICK($X, $Y) // KLICK PO POSICIY
     
      wait(1)     
      GETSCREEN
      IF_PICTURE_IN (273,106, 1057,726, "sobaka.bmp")
         LCLICK($_return1+13, $_return2+3)
         waitms(50)
         LCLICK($_return1+13, $_return2+3)
         waitms(50)
         
         KEYDOWN (#CTRL)
         WAITMS (50)
         KEYPRESS (#C)
         KEYUP (#CTRL)
         
         $nik = FROMCLIP()
         TFWRITE("nik.txt", $nik)
         
         waitms(50)
         
         GETSCREEN
         IF_PICTURE_IN (750,78,905,754, "Close.bmp")
            LCLICK($_return1+4, $_return2+2)
            waitms(50)
         END_IF
      ELSE
         GETSCREEN
         IF_PICTURE_IN (750,78,905,754, "Close.bmp")
            LCLICK($_return1+4, $_return2+2)
            waitms(50)
         END_IF
      END_IF
                 
   END_IF
END_CYC

UNDEFINE($ARR_SCAN)
TFCLEAR("position.txt", 0)
waitms(50)

move(643,421)  // v centr
waitms(50)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)
WHEELDOWN
waitms(150)


И еще, в условии  IF(($X > $X2) | ($Y > $Y2)) скорее всего должно быть логическое И - and; &
« Last Edit: December 30, 2020, 12:38:24 AM by dramster »

mAramiXx

  • Освоившийся
  • **
  • Posts: 34
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #5 on: December 30, 2020, 12:45:04 AM »
Основная ошибка, это попытка чтения не существующей строки TFREAD("position.txt", $position). После цикла нужно обнулять наращиваемую переменную $position.
 Но помимо этого, еще ошибки:
 $SCAN_COUNT тоже нужно обнулять.
 TFWRITE("position.txt", ($X, $Y)) - так писать нельзя. TFWRITE (file, str, [str_n] ), file - имя файла, str - строка, str_n - необязательный параметр; номер строки в файле. Если нужно записать координаты через запятую или другой разделитель, то правильно так - TFWRITE("position.txt", STRCONCAT ($X, ",", $Y)).
 А главное, запись в файл координаты это лишнее. Можно действовать сразу в первом же цикле без записи и последующего чтения файла.
 
,

Спасибо!!! Обнулил переменные и заметил строку записи - и всё работает))

Жесть, убил часов 5 на поиск ошибки. Обнулять пробовал тоже, но не помогало. Видимо основная проблема была в том, как я записываю в файл)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #6 on: December 30, 2020, 09:11:17 AM »
 :) а файл проверить не додумался?
Я как увидел чудо в виде
Code: (clickermann) [Select]
$stroka = TFREAD("position.txt", $position)
сразу подумал, а что же там реально запишется, что ты не замечаешь.
Запустил
Code: (clickermann) [Select]
$X = 100
$Y = 200
TFWRITE("position.txt", ($X, $Y))
HALT
и получил в файле
Quote
100.2


mAramiXx

  • Освоившийся
  • **
  • Posts: 34
    • View Profile
Re: Ошибка после повторного запуска кода
« Reply #7 on: December 30, 2020, 02:49:57 PM »
Это я увидел, но не понял почему такие координаты проскакивают)) даже код проверки вставил для них)

но теперь дошло, что там нули. Спасибо)