Author Topic: странный глюк, цикл for  (Read 8085 times)

0 Members and 1 Guest are viewing this topic.

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
странный глюк, цикл for
« on: February 05, 2016, 10:56:32 PM »
Code: (clickermann) [Select]
//===================================
FOR($num=0, $num<arrsize($num_line_start))
   FOR ($y=$y2_cap, $y>$y1_cap, -1)
      FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
         IF(pxl($x,$y)  = 0)
            ARRPUSH($num_y2,$y)
            $y=0
            $x=$num_line_end[$num]+1
           
         END_IF
      END_CYC
      print( $y, " ",$y1_cap )
   END_CYC
END_CYC

здесь $y2_cap=347, $y1_cap=334. Цикл пашет  от 347, вниз. НО! после первого прохода цикла, он ругается на inc($y,-1) и работать не хочет. я долго бился, не мог найти корень, как исправить.  если прописать

Code: (clickermann) [Select]
   FOR ($y=347, $y>$y1_cap, -1) То все работает идеально.
print($y1_cap+1) выдает в лог 348, все верно. почему же такая хрень?
пробую писать
Code: (clickermann) [Select]
$mm=$y2_cap
 FOR ($y=$mm, $y>$y1_cap, -1)
Но тоже вылетает ошибка inc($y,-1)
Решил вот так, но все же интересно, что это за хрень))
 
Code: (clickermann) [Select]
$y2_cap = $mm+$y2_cap//мм ноль, поэтому ничего не меняется, но  ошибка пропала
  FOR ($y=$y2_cap, $y>$y1_cap, -1)
Код во вложении, 76 строка. проверял капчу на этой странице  http://wekings.ru/login

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: странный глюк, цикл for
« Reply #1 on: February 08, 2016, 12:22:31 PM »
Всё таже старая ошибка
http://crapware.aidf.org/forum/index.php?topic=2221.msg13411#msg13411

Проблема не в циклах а в извлечении из массива. Здесь:
Code: (clickermann) [Select]
$y2_cap=ARRPOP($cap_arr)
ARRPOP читает любую переменную как строку.
всякие вычисления проверяют, можно ли переменную перевести в число и если можно переводят, поэтому после
Code: (clickermann) [Select]
$y2_cap = $y2_cap + 0$y2_cap будет уже число.

Цикл For в принципе состоит из двух частей, проверки условия и наращивание переменной. Во всех проверках условий число восстанавливается правильно из строки. А наращивалка видать осталась нетронута со старых версий и проверки как в вычислениях выше не происходит. Да и хорошо.


Проще запомнить, если вытаскиваешь по ARRPOP, а не по индексу то лучше сразу приводить к числу.
Для целых
Code: (clickermann) [Select]
$y2_cap = INT(ARRPOP($cap_arr))
Ну или
Code: (clickermann) [Select]
$y2_cap = ARRPOP($cap_arr)+0
Или доставать по индексу если можно
Code: (clickermann) [Select]
$y2_cap = $cap_arr[ARRSIZE($cap_arr-1)]
« Last Edit: February 08, 2016, 12:25:42 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: странный глюк, цикл for
« Reply #2 on: February 10, 2016, 09:12:41 PM »
тоже часто напарываюсь на путанницу между строками и числами в массивах. но если перевести строку в число - это уже вошло в привычку INT(), то бывают засады в обратном:
Code: (clickermann) [Select]
STRSEPARATE ("mail@mail.ma:001230", ":", $arr)
print("log:", $arr[0])
print("pass:", $arr[1])
print("arrpop:",arrpop($arr))
halt
Code: [Select]
21:12:38 log:mail@mail.ma
21:12:38 pass:1230
21:12:38 arrpop:001230

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: странный глюк, цикл for
« Reply #3 on: February 10, 2016, 11:23:30 PM »
угу, строку в число - int()
или $var= $var / 1  для дробных

а в обратном использую самописную подпрограмму разбиения строки на массив вместо strseparate, чтобы гарантированно получать строки при обращении по индексу
« Last Edit: February 10, 2016, 11:25:39 PM by i0 »

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: странный глюк, цикл for
« Reply #4 on: February 11, 2016, 12:08:41 PM »
Все вышеописаное - недочеты конкретных функций. Что separate, что inc (используемый в for), что ранее tfReadArr, но аналогично будут пофиксены с последним обновлением.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: странный глюк, цикл for
« Reply #5 on: February 11, 2016, 02:59:36 PM »
Про точку не забыл? Которая в 0 превращается.
"."  = 0


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: странный глюк, цикл for
« Reply #6 on: February 11, 2016, 03:07:59 PM »
Забыл. Я же просил список багов. Я же не могу все сообщения читать.
И у вас темы называются типа "Бот для рыбалки глючит, помогите!" а внутри описание как кликер крашит систему.

Че там с точкой. Есть пример кода?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: странный глюк, цикл for
« Reply #7 on: February 11, 2016, 03:27:42 PM »
ну как- то так
Code: (clickermann) [Select]
IF(STRCUT("цена 7389.014", 10, 1) = 0)
   LOGWRITE ($n)
END_IF
IF(STRCUT("цена 7389.014", 11, 1) = 0)
   LOGWRITE ($n)
END_IF

Короче если в строке остаётся одна точка, многие функции переводят её в 0

Вот ещё
http://crapware.aidf.org/forum/index.php?topic=356.msg8215#msg8215


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: странный глюк, цикл for
« Reply #8 on: February 11, 2016, 05:38:33 PM »
можно еще проще
Code: (clickermann) [Select]
IF("." = "0")
   LOGWRITE ("oops")
END_IF

я так понимаю это только в проверке условия такая фигня. ну посмотрю завтра. завтра же наверно и запилю очередню бетку на выходные поиграться. так уже много чего пофиксил из старого

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: странный глюк, цикл for
« Reply #9 on: February 11, 2016, 06:10:58 PM »
Не только. При передаче в подпрограмму слетит. Может ещё где.


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: странный глюк, цикл for
« Reply #10 on: February 13, 2016, 03:06:54 PM »
точечка оказалась не так проста, ее считает нулем сам компилятор (видимо но аналогии с С) и переубеждать его в этом - занятие долгое.
в условиях, где она и может вызвать самый диссонанс у юзера, починил. но если кто то решит пихнуть точку в качестве числового аргумента, она все же будет нулем. наверное.

извольте учитывать типы данных. программы на других языках просто бы выплюнули исключение и завершили выполнение.