Author Topic: Циклы, массивы, обнуления  (Read 3986 times)

0 Members and 3 Guests are viewing this topic.

Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Циклы, массивы, обнуления
« on: November 08, 2016, 07:12:38 PM »
Здравствуйте. Есть такой вот кусок кода. Проблема в том что переменная $count не обнуляется. Более того не обнуляется arrsize($partyHpArr). пробовал undefinу, разные названия переменных, хотя в моем понимании все должно работать так, как написано сейчас. Возможно я в чем то ошибаюсь и не вижу этого в упор

Code: (clickermann) [Select]
sub(partyHeal)
   getscreen()
   SCANPXL($partyHpArr,$pHpX1,$wy1,$pHpX2,$wy2,$colPartyHpLive)
   $count = arrsize($partyHpArr)
   if($count > 0)
      $pHpY = 0
      $minX = 1000
      for($i=1,$i < $count)
         if($partyHpArr[$i] ! $phpY)
            SCANPXL($partyYArr,$pHpX1,$partyHpArr[$i],$pHpX2,$partyHpArr[$i],$colPartyHpLive)
            $X = $partyYArr[arrsize($partyYArr) - 2]
            if($minX > $X)
               $minX = $X
               $minY = $partyHpArr[$i]
            end_if
         end_if
         INC($i,2)
      end_cyc
      if($minX ! $pHpX2)
         IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svHeal.bmp")
            logwrite(partyHeal)
            IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svPreHeal.bmp")
               keypress($btnPreHeal)
               waitms($timeSkill)
            end_if
            MOVE($minX,$minY)
            waitms($timeButton)
            lclick($minX,$minY)
            waitms($timeButton)
            keypress($btnHeal)
            waitms($timeSkill)
            $f = 1
         end_if
      end_if
   end_if
end_sub

т.е. logwrite($count) выдает вот такое вот
Code: [Select]
21:15:11 302
21:15:12 604
21:15:12 906
21:15:13 1208
21:15:13 1510
21:15:15 1812
21:15:16 2114
21:15:17 2416
« Last Edit: November 08, 2016, 07:16:08 PM by Amperandus »

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #1 on: November 08, 2016, 07:26:08 PM »
Из такого, что первым бросается в глаза -  у тебя 
Code: (Clickermann) [Select]
$count = arrsize($partyHpArr)
....
for($i=1,$i < $count)
....

Quote from: help.chm
Примечания
Не стоит забывать, что индексация массива идет от нуля, поэтому максимально доступный индекс всегда будет arrsize()-1

Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #2 on: November 08, 2016, 07:42:03 PM »
так и есть. в нормальном цикле было бы <= а тут только <

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #3 on: November 08, 2016, 08:53:18 PM »
getscreen() - у функции не нужно писать пустые скобки
logwrite(partyHeal) - строки нужно помещать в кавычки
INC($i,2) - цикл фор сам наращивает переменную, причем последним параметром можно указать на сколько.
Code: (clickermann) [Select]
sub(partyHeal)
   getscreen
   SCANPXL($partyHpArr,$pHpX1,$wy1,$pHpX2,$wy2,$colPartyHpLive)
   $count = arrsize($partyHpArr)
   if($count > 0)
      $pHpY = 0
      $minX = 1000
      for($i=0,$i < $count,2)
         if($partyHpArr[$i] ! $phpY)
            SCANPXL($partyYArr,$pHpX1,$partyHpArr[$i],$pHpX2,$partyHpArr[$i],$colPartyHpLive)
            $X = $partyYArr[arrsize($partyYArr) - 2]
            if($minX > $X)
               $minX = $X
               $minY = $partyHpArr[$i]
            end_if
         end_if
      end_cyc
      if($minX ! $pHpX2)
         IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svHeal.bmp")
            logwrite("partyHeal")
            IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svPreHeal.bmp")
               keypress($btnPreHeal)
               waitms($timeSkill)
            end_if
            MOVE($minX,$minY)
            waitms($timeButton)
            lclick($minX,$minY)
            waitms($timeButton)
            keypress($btnHeal)
            waitms($timeSkill)
            $f = 1
         end_if
      end_if
      UNDEFINE($partyHpArr)
   end_if
end_sub
« Last Edit: November 08, 2016, 08:56:12 PM by Oraven »

Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #4 on: November 09, 2016, 09:26:16 AM »
Спасибо вот это помогло

UNDEFINE($partyHpArr)

но не понятна природа явления. я читал про то, что переменная в цикле не обнуляется, но вроде бы не тот случай в моем коде. Придется теперь все arrsize проверять :(


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #5 on: November 09, 2016, 09:38:13 AM »
UNDEFINE($partyHpArr)
но не понятна природа явления. я читал про то, что переменная в цикле не обнуляется, но вроде бы не тот случай в моем коде. Придется теперь все arrsize проверять :(

При чём здесь arrsize?
функция SCANPXL($partyHpArr....     ищет подходящие пикселы и собирает их координаты в массив $partyHpArr. Если массив не пустой, то данные добавляются. То же самое и смассивом $partyYArr.
Т.к. этот код находится в подпрограмме и вызывается много раз, нужно очищать массивы перед/после каждого прохода. Если , конечно, задача другая не стоит.


Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #6 on: November 09, 2016, 10:06:17 AM »
Да имелось в виду массив целиком, тут слегка в запаре просто.

Quote
Стоит добавить, что массивы, как и переменные хранят свои значения. Поэтому последовательный вызов двух scanpicture (например) без извлечения элементов через arrpop приведет к тому что у вас будет двойная очередь координат. Поэтому если вам для работы необходим «чистый» массив, то не забывайте высвобождать память, путем вызова undefine($var). Тут все как для переменных.

разве переменные не обнуляются при новом цикле?

подпрограмма вызывается ровно один раз.

$partyHpArr - 1 раз инициализируется за цикл.

$partyYArr - тут вот может быть и надо обнулять.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #7 on: November 09, 2016, 10:13:59 AM »
разве переменные не обнуляются при новом цикле?

С чего бы это?

подпрограмма вызывается ровно один раз.
$partyHpArr - 1 раз инициализируется за цикл.
$partyYArr - тут вот может быть и надо обнулять.

Тут тебе видней. Показал ты только подпрограмму.


Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #8 on: November 09, 2016, 10:41:50 AM »
в общем и целом понятно. спасибо за объяснения, до этого с массивами не приходилось сталкиваться в clickermanne.

Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #9 on: November 09, 2016, 02:29:47 PM »
чтобы не плодить темы

толи лыжи не едут то ли я ****

Code: (clickermann) [Select]
   $hwnd = wndfind("***")
   wndgetinfo($hwnd, $wx1, $wy1, $w, $h)
   if($wx1 ! 0 OR $wy1 ! 0)
   logwrite("pos")
      wndpos($hwnd,0,0)
      wait(5)
   end_if
   logwrite($w,"\",$h)
   if($w ! 1280 OR $h ! 700)
   logwrite($w,"/",$h)
      wndsize($hwnd,1280,700)
      wait(5)
   end_if

Code: [Select]
16:24:36 1280\700
16:24:36 1280/700
16:24:45 1280\700
16:24:45 1280/700
16:24:56 1280\700
16:24:56 1280/700
16:25:06 1280\700
16:25:06 1280/700

Почему if($w ! 1280 OR $h ! 700) выполняется, хотя не должно. ну по моей логике.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #10 on: November 09, 2016, 02:50:36 PM »
Почему if($w ! 1280 OR $h ! 700) выполняется, хотя не должно. ну по моей логике.

Потому что минимум
Code: (clickermann) [Select]
if(($w ! 1280) OR ($h ! 700))
И в верхнем условии тоже


Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #11 on: November 09, 2016, 03:02:06 PM »
тоже не то... пойду юзать поиск, не найду вернусь
« Last Edit: November 09, 2016, 03:05:46 PM by Amperandus »

Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #12 on: November 09, 2016, 03:29:34 PM »
Quote
a ! b - истинно, если a неравно b (поддерживает строки)

что то я не понимаю...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #13 on: November 09, 2016, 03:34:24 PM »
тоже не то... пойду юзать поиск, не найду вернусь

Что не то?
Code: (clickermann) [Select]
$w = 1280
$h = 700

IF(($w ! 1280) OR ($h ! 700))
    logwrite($w,"/",$h)
ELSE
    LOGWRITE("условие не выполняется")   
END_IF
HALT

Code: [Select]
15:34:22 условие не выполняется


Amperandus

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Циклы, массивы, обнуления
« Reply #14 on: November 09, 2016, 04:00:51 PM »
Спасибо. Все таки я, крыша слегка едет от работы и еще в промежутках тут пытаюсь ковыряться - вот и получается что то не то.