Author Topic: Два масива в один, или как сделать проще  (Read 2618 times)

0 Members and 1 Guest are viewing this topic.

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Помогите оптимизировать, эти масивы все не как не поддаются...
Еще проблема иногда тупо не работает, не могу понять почему.
Образец в закрепе

Code: (clickermann) [Select]
$Start = 0
WHILE($Start = 0)  // Получаю начало координат х и у
   GETSCREEN (15,590, 145,615)
   COLORMODE(8, 15,590, 145,615)
   IF_PICTURE_IN (15,590, 145,615, "Коры\x.bmp")
      $Sx = $_return1+15
      $Sy = $_return2
      IF_PICTURE_IN (15,590, 145,615, "Коры\y.bmp")
         $Start = 1
         $Sx2 = $_return1+15
         $Sy2 = $_return2
         WAITMS(10)
      ELSE
         WAITMS(10)
         LOGWRITE ("нет координат")
      END_IF
   END_IF
END_CYC

// Сканирую цифры по х
UNDEFINE($arr)
$Stop = 0   
WHILE($Stop = 0)
   FOR($No = 0, $No <= 10)
      IF_PICTURE_IN ($Sx,$Sy, $Sx+7,$Sy+11, STRCONCAT("Коры\",$No,".bmp"))
         IF($No = 10)
            $Stop = 1
         ELSE
            ARRPUSH($arr, $No)
         END_IF
         $No = 777
      END_IF
   END_CYC
   INC($Sx,7)
END_CYC

$x = ""
FOR($a=0,$a<ARRSIZE($arr))
   $x = STRCONCAT($x,$arr[$a])
END_CYC

// Сканирую цифры по у
UNDEFINE($arr)
$Stop = 0
WHILE($Stop = 0)
   FOR($No = 0, $No <= 10)
      IF_PICTURE_IN ($Sx2,$Sy2, $Sx2+7,$Sy2+11, STRCONCAT("Коры\",$No,".bmp"))
         IF($No = 10)
            $Stop = 1
         ELSE
            ARRPUSH($arr, $No)
         END_IF
         $No = 777
      END_IF
   END_CYC
   INC($Sx2,7)
END_CYC

$y = ""
FOR($a=0,$a<ARRSIZE($arr))
   $y = STRCONCAT($y,$arr[$a])
END_CYC


LOGWRITE ($x," - ", $y)
halt


« Last Edit: May 25, 2022, 11:03:01 PM by Ramzesia »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
В начале цикл ждёт до победного одновременно две картинки x.bmp y.bmp . При чём если x.bmp нашли, а y.bmp нет  то выводим "нет координат". Странное поведение.

Цикл стр. 22-35
ищем, я так понял, цифры 0-9 и знак окончания строки 10.bmp  - это запятая?
Если нам что-то помешает её найти, то уйдём в бесконечный цикл. А по приложенному образцу в jpeg ничего нельзя гарантировать, там мусор.


А что именно оптимизировать?
Как минимум делается одно и то же 2 раза для X и Y, значит вынести в подпрограмму.
Раз начал делать велосипед... Если дальше оптимизировать и не перебирать на каждом знакоместе все цифры, то получится мой код где ищет через SCANPICTURE
Сейчас в худшем варианте при координатах 999999, 999999  будет 71+71 поиск.
« Last Edit: May 26, 2022, 02:29:16 PM by Vint »


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Фотку находит всегда, ну во всяком случае еще не было так что бы не нашел, картинки нормальные, без всяких помех, находятся быстро и четко, совпадение 100%.
Фотку не могу выложить, пишет место заполненное свяжитесь с администратором.
ищем цифры от 0-9 10 это запятая, тоже находит 100%
Завернуть в подпрограмму не могу потому что этот кусок целиком является подпрограммой, и если его вызывать в подпрограмме то не работает.

Теперь по теме, методом лога после какждых манипуляций поставил запись в лог, иногда случается проблема, второй масив тупо не заполняется, картинки находит но размер масива тупо не выводится, и уходит в бесконечность в цикле на 60 строке. а насчет оптимизации, думал можно завернуть оба числа в 1 масив потом достать отдельно в переменные х у.
пытался твоим скриптом пользоватся, но он для моей простой задачи слишком сложный, я не смог в нем разобраться...
 

Vint

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

Это как так? Да хоть десяток подпрограмм. Следить только за не пересечением переменных.

Code: (clickermann) [Select]
SUB(scan_number, $Sx_sn, $Sy_sn)
    UNDEFINE($arr_sn)
    $Stop = 0
    WHILE($Stop = 0)
        FOR($No_sn = 0, $No <= 10)
            IF_PICTURE_IN($Sx_sn,$Sy_sn, $Sx_sn+7,$Sy_sn+11, STRCONCAT("Коры\",$No_sn,".bmp"))
                IF($No_sn = 10)
                    $Stop = 1
                ELSE
                    ARRPUSH($arr_n, $No_sn)
                END_IF
                $No_sn = 777
            END_IF
        END_CYC
        INC($Sx_sn, 7)
    END_CYC
   
    $number_result = ""
    FOR($i=0, $i < ARRSIZE($arr_sn))
        $number_result = STRCONCAT($number_result, $arr_sn[$i])
    END_CYC
END_SUB
//==============================================================================


$Start = 0
WHILE($Start = 0)  // Получаю начало координат х и у
    GETSCREEN(15,590, 145,615)
    COLORMODE(8, 15,590, 145,615)
    IF_PICTURE_IN(15,590, 145,615, "Коры\x.bmp")
        $Sx = $_return1 + 15
        $Sy = $_return2
        IF_PICTURE_IN(15,590, 145,615, "Коры\y.bmp")
            $Start = 1
            $Sx2 = $_return1 + 15
            $Sy2 = $_return2
        END_IF
    END_IF
    WAITMS(10)
END_CYC

// Сканирую цифры по х
scan_number($Sx, $Sy)
$x = $number_result

// Сканирую цифры по у
scan_number($Sx2, $Sy2)
$y = $number_result

LOGWRITE($x," - ", $y)

HALT

Теперь по теме, методом лога после какждых манипуляций поставил запись в лог, иногда случается проблема, второй масив тупо не заполняется, картинки находит но размер масива тупо не выводится, и уходит в бесконечность в цикле на 60 строке.
На 60 строке в приведённом скрипте он в бесконечный уйти не может, 60 это наверно в изменённом. А уходит как я писал, потому, что не находит символ окончания "запятая" может там Y не точно вырезан или возможно смещение меняется. В этом же скрипте всё по чётким размерам.

Не решить проблему, но избавиться от бесконечного цикла можно заменив цикл WHILE($Stop = 0) на FOR например по 20 итерациям (будет искать число не больше, чем в 10 знакомест), если вышли и переменная цикла последняя, то ничего не нашли и можно координате присваивать -10000 к примеру. Всё от задачи зависит.


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Спасибо за ответ, а если такая ситуация, 1 файл с подпрограммой, в нем допустим 2 подпрограммы, во втором сабе вызов первого. Во вторм файле в скрипте вызываю эту подпрограмму она будет работать? Возможно я что и сделал не правильно. Вот такой пример будет работать?

Code: (clickermann) [Select]
// Файл1 с сабами

SUB(имя1)
   // тело выполняется только после вызова
END_SUB


SUB(имя2)
   /имя1()
END_SUB

// ========================================

// Файл2 со скриптом

SUB(имя3)
   /имя2()
END_SUB

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Спасибо за ответ, а если такая ситуация, 1 файл с подпрограммой, в нем допустим 2 подпрограммы, во втором сабе вызов первого. Во вторм файле в скрипте вызываю эту подпрограмму она будет работать? Возможно я что и сделал не правильно. Вот такой пример будет работать?
Будет.