Автор Тема: странный глюк, цикл for  (Прочитано 2000 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Кликермен

  • Активный участник
  • ***
  • Сообщений: 112
    • Просмотр профиля
странный глюк, цикл for
« : Февраль 05, 2016, 10:56:32 pm »
Код: Clickermann
  1. //===================================
  2. FOR($num=0, $num<arrsize($num_line_start))
  3.   FOR ($y=$y2_cap, $y>$y1_cap, -1)
  4.      FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
  5.         IF(pxl($x,$y)  = 0)
  6.            ARRPUSH($num_y2,$y)
  7.            $y=0
  8.            $x=$num_line_end[$num]+1
  9.  
  10.         END_IF
  11.      END_CYC
  12.      print( $y, " ",$y1_cap )
  13.   END_CYC
  14. END_CYC

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

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #1 : Февраль 08, 2016, 12:22:31 pm »
Всё таже старая ошибка
http://crapware.aidf.org/forum/index.php?topic=2221.msg13411#msg13411

Проблема не в циклах а в извлечении из массива. Здесь:
Код: Clickermann
  1. $y2_cap=ARRPOP($cap_arr)

ARRPOP читает любую переменную как строку.
всякие вычисления проверяют, можно ли переменную перевести в число и если можно переводят, поэтому после
Код: Clickermann
  1. $y2_cap = $y2_cap + 0
$y2_cap будет уже число.

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


Проще запомнить, если вытаскиваешь по ARRPOP, а не по индексу то лучше сразу приводить к числу.
Для целых
Код: Clickermann
  1. $y2_cap = INT(ARRPOP($cap_arr))

Ну или
Код: Clickermann
  1. $y2_cap = ARRPOP($cap_arr)+0

Или доставать по индексу если можно
Код: Clickermann
  1. $y2_cap = $cap_arr[ARRSIZE($cap_arr-1)]
« Последнее редактирование: Февраль 08, 2016, 12:25:42 pm от Vint »


dramster

  • Герой форума
  • *****
  • Сообщений: 957
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #2 : Февраль 10, 2016, 09:12:41 pm »
тоже часто напарываюсь на путанницу между строками и числами в массивах. но если перевести строку в число - это уже вошло в привычку INT(), то бывают засады в обратном:
Код: Clickermann
  1. STRSEPARATE ("mail@mail.ma:001230", ":", $arr)
  2. print("log:", $arr[0])
  3. print("pass:", $arr[1])
  4. print("arrpop:",arrpop($arr))
  5. halt
21:12:38 log:mail@mail.ma
21:12:38 pass:1230
21:12:38 arrpop:001230

i0

  • Оплот сообщества
  • ****
  • Сообщений: 354
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #3 : Февраль 10, 2016, 11:23:30 pm »
угу, строку в число - int()
или $var= $var / 1  для дробных

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

Johnny

  • Создатель
  • Герой форума
  • *
  • Сообщений: 588
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #4 : Февраль 11, 2016, 12:08:41 pm »
Все вышеописаное - недочеты конкретных функций. Что separate, что inc (используемый в for), что ранее tfReadArr, но аналогично будут пофиксены с последним обновлением.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #5 : Февраль 11, 2016, 02:59:36 pm »
Про точку не забыл? Которая в 0 превращается.
"."  = 0


Johnny

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

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #7 : Февраль 11, 2016, 03:27:42 pm »
ну как- то так
Код: Clickermann
  1. IF(STRCUT("цена 7389.014", 10, 1) = 0)
  2.   LOGWRITE ($n)
  3. END_IF
  4. IF(STRCUT("цена 7389.014", 11, 1) = 0)
  5.   LOGWRITE ($n)
  6. END_IF

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

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


Johnny

  • Создатель
  • Герой форума
  • *
  • Сообщений: 588
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #8 : Февраль 11, 2016, 05:38:33 pm »
можно еще проще
Код: Clickermann
  1. IF("." = "0")
  2.   LOGWRITE ("oops")
  3. END_IF

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #9 : Февраль 11, 2016, 06:10:58 pm »
Не только. При передаче в подпрограмму слетит. Может ещё где.


Johnny

  • Создатель
  • Герой форума
  • *
  • Сообщений: 588
    • Просмотр профиля
Re: странный глюк, цикл for
« Ответ #10 : Февраль 13, 2016, 03:06:54 pm »
точечка оказалась не так проста, ее считает нулем сам компилятор (видимо но аналогии с С) и переубеждать его в этом - занятие долгое.
в условиях, где она и может вызвать самый диссонанс у юзера, починил. но если кто то решит пихнуть точку в качестве числового аргумента, она все же будет нулем. наверное.

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