Author Topic: Подскажите команду  (Read 3885 times)

0 Members and 1 Guest are viewing this topic.

Tamago4aRUS

  • Освоившийся
  • **
  • Posts: 32
    • View Profile
Подскажите команду
« on: August 30, 2017, 05:17:43 AM »
Если не выполняется какое-то условие в цикле WHILE то скрипт как бы начинает воспроизводиться с определённой строчки.

Атеист

  • Guest
Re: Подскажите команду
« Reply #1 on: August 30, 2017, 07:33:47 AM »
Если не выполняется какое-то условие в цикле WHILE то скрипт как бы начинает воспроизводиться с определённой строчки.

GOTO конечно  :)

Quote from: из Справки
[spoiler]

GOTO

Синтаксис

GOTO (label) - переводит интерпретацию на строку с меткой

Параметры

label - имя метки

Пример

goto(skip)

logwrite("nope") // пропускается
skip:
logwrite("yea")  // выполнится

Примечания

Переход на метку допускается в рамках блоков одного уровня вложенности. Текстовая метка задается без кавычек, в тексте скрипта после текстовой метки обязательно должно идти двоеточие ":", как в примере. Метка занимает всю строку


[/spoiler]

Кто то может быть не согласен с таким решением, но внятно объяснить почему нельзя использовать GOTO, а тем более привести пример кода с неправильным использованием этой команды и с вытекающим из этого не верным результатом его работы, скорее всего не сможет. Вот такая вот интрига.  :)
А если серьезно, то прежде чем ответить на вопрос, нужно видеть сам скрипт. Что за цикл, и с какой "определённой строчки" он должен продолжить свою работу если какое(?)-то условие в этом цикле не выполняется?

Атеист

  • Guest
Re: Подскажите команду
« Reply #2 on: August 30, 2017, 09:30:40 AM »
Интриги никакой нет;
 кто выскакивает из циклов и подпрограмм -  просто, неопытный пользователь
 кто делает это осознанно  - дурачек
 кто учит этому других - педобраз.
О эпитетах для этих трёх категорий можно поспорить, но суть  вопроса от этого не меняется.
Соберите единомышленников, уверенных в обратном, а я буду в личку присылать вам скрипты  с примером кода, убедительно доказывающие, что вы используете GOTO в данных случаях очень напрасно, постараюсь делать работу скриптов индивидуальной и запоминающейся, чтоб небыло стандартной реакции " ... а, ну ладно." По другому таких, как вы видимо не научишь.
В стопятсотый раз не вижу смысла распинаться и замусоривать форум те, что масло - маслянное.
GOTO - очень полезная и нужная команда для начинаюших и тех кто сознательно решил ухудшить для чужих читаемость своего кода! 8)

Так есть код подтверждающий, что GOTO дурно влияет на результаты его выполнения, при неправильном использовании (например выпрыгивании из подпрограммы, или из цикла)? Пока были только ни чем не подтвержденные догадки, со ссылкой на "хороший тон" и "читаемость кода". А сами просите компилятор,... какая в exe-шнике читаемость кода для конечного пользователя? ;D Один словесный понос короче.

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Re: Подскажите команду
« Reply #3 on: August 30, 2017, 09:35:27 AM »
Так есть код подтверждающий, что GOTO дурно влияет на результаты его выполнения, при неправильном использовании (например выпрыгивании из подпрограммы, или из цикла)? Пока были только ни чем не подтвержденные догадки, со ссылкой на "хороший тон" и "читаемость кода". А сами просите компилятор,... какая в exe-шнике читаемость кода для конечного пользователя? ;D Один словесный понос короче.
Пажалста.
http://crapware.aidf.org/forum/index.php?topic=3321.msg22667#msg22667

Атеист

  • Guest
Re: Подскажите команду
« Reply #4 on: August 30, 2017, 10:18:07 AM »
Так есть код подтверждающий, что GOTO дурно влияет на результаты его выполнения, при неправильном использовании (например выпрыгивании из подпрограммы, или из цикла)? Пока были только ни чем не подтвержденные догадки, со ссылкой на "хороший тон" и "читаемость кода". А сами просите компилятор,... какая в exe-шнике читаемость кода для конечного пользователя? ;D Один словесный понос короче.
Пажалста.
http://crapware.aidf.org/forum/index.php?topic=3321.msg22667#msg22667

Согласен. Это пока первое подтверждение, которое я тут видел что GOTO может вредить. Подпрограмма прокручивается 3 раза сама собой без видимых причин.
Oraven и open_78, спасибо за пример. Хотя, такой код написать это все равно, что HALT в начале скрипта вставить, а потом кричать, что HALT - зло, так как скрипт перестал работать. Но действительно в многострочном скрипте можно с GOTO запутаться. Я пока как-то не попадал.)
Значит все таки не зря я завел тему про GOTO.)
« Last Edit: August 30, 2017, 11:05:09 AM by Атеист »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подскажите команду
« Reply #5 on: August 30, 2017, 05:48:20 PM »
Так есть код подтверждающий, что GOTO дурно влияет на результаты его выполнения, при неправильном использовании (например выпрыгивании из подпрограммы, или из цикла)? Пока были только ни чем не подтвержденные догадки, со ссылкой на "хороший тон" и "читаемость кода". А сами просите компилятор,... какая в exe-шнике читаемость кода для конечного пользователя? ;D Один словесный понос короче.
Согласен. Это пока первое подтверждение, которое я тут видел что GOTO может вредить. Подпрограмма прокручивается 3 раза сама собой без видимых причин.
Второе:
http://crapware.aidf.org/forum/index.php?topic=1992.msg11912#msg11912
Кодом
Code: (clickermann) [Select]
$i = 10
$n = 5
WHILE($i = 10)
GOTO(tuda)
END_CYC

LOGWRITE("Код после первого цикла")

WHILE($n = 5)
tuda:
LOGWRITE("Мы в цикле 2")

// хоть код и расположен во втором цикле
// фактически он в первом
// и 2-й цикл нельзя прервать нарушив второе условие
$n = 0
END_CYC
LOGWRITE("Конец")
HALT

Или так
Code: (clickermann) [Select]
FOR($i=0, $i < 2)
GOTO(tuda)
END_CYC

LOGWRITE("Код после первого цикла")

FOR($j=0, $j < 2)
tuda:
LOGWRITE("Мы в цикле 2.  i/j =", $i, "/", $j)
END_CYC
HALT


Или уж совсем
Code: (clickermann) [Select]
SUB(sub1)
    LOGWRITE("sub1")
    IF($t = 0)
        GOTO(prig1)
    END_IF
END_SUB


sub1()
LOGWRITE("Какого хрена?")
GOTO(fin)

prig1:

GOTO(prig2)
FOR($n=0, $n < 100)
    prig2:
    LOGWRITE("Мы в теле FOR")
END_CYC

fin:
LOGWRITE("Конец")
HALT

Code: [Select]
17:46:56 sub1
17:46:56 Мы в теле FOR
17:46:56 Какого хрена?
17:46:56 Конец


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подскажите команду
« Reply #6 on: August 30, 2017, 06:05:53 PM »
Пажалста.
http://crapware.aidf.org/forum/index.php?topic=3321.msg22667#msg22667

Согласен. Это пока первое подтверждение, которое я тут видел что GOTO может вредить. Подпрограмма прокручивается 3 раза сама собой без видимых причин.

Причины ясны. Могу расписать
Код из ссылки:
Code: (clickermann) [Select]
SUB(prog, $a)
    skip:
    WHILE($q < 3)
        inc($q)
        print($q)
        GOTO(skip)
    END_CYC
    print($a," в подпрограмме")
END_SUB

print("начало")

prog("подпрограмма")

print("конец")

HALT

Эпикриз:
Quote
1. стр.6  пропускаем END_CYC. Точка возврата остаётся на стеке. Так 3 раза.
2. На вершине  стека 3 перехода (возврата к итерации) WHILE
3. Потом $q = 3 и цикл WHILE пропускается
4. стр. 8 print "подпрограмма в подпрограмме"
5. доходим до END_SUB, уничтожаем локальную переменную $a и...
6. END_SUB - выход из подпрограммы. Это мы так думаем. На самом деле адрес выхода снимается с вершины стека, а там фига! в ВИДЕ 3-х адресов на WHILE
7. Теперь уже крутится участок стр.6 - стр.9  WHILE-END_SUB, пока неправильные адреса не кончатся и мы не дойдём до родного адреса возврата из подпрограммы.


Атеист

  • Guest
Re: Подскажите команду
« Reply #7 on: August 30, 2017, 08:44:03 PM »
Виталий спасибо за наглядные примеры и подробные объяснения. Тему добавил в закладки.
Я и в правду не недооценивал коварность GOTO, хотя сам на такие серьезные грабли не наступал, чтобы память отъедало или самому запутаться в своих скриптах, или чтобы комп начинал тормозить. Вот примерно такие конструкции у меня крутятся ежедневно, по несколько часов, непрерывно, в два потока. Прыгаю из подпрограмм  вперемешку с циклами, правда все в одну точку. И проблем пока не наблюдалось. Странно, но ошибок выполнения нет, не первый год скриптам этим. А переделать всё руки не доходят.

[spoiler=Просто пример (не для подражания :))]
Code: (clickermann) [Select]
start:

SUB(действие_1)
   IF(PXL(10,10) ! 2444758)
      GOTO(start)
   END_IF
   KEYPRESS(#A)
   WAITMS(10)
END_SUB

SUB(действие_2)
   IF(PXL(10,10) ! 14284031)
      GOTO(start)
   END_IF
   KEYPRESS(#B)
   WAITMS(10)
END_SUB

// ...

SUB(действие_44)
   действие_8()
   действие_19()
   действие_2()
END_SUB

SUB(действие_50)
   IF(PXL(10,10) ! 14284031)
      GOTO(start)
   END_IF
   действие_44()
END_SUB

//--------------------------------

SWITCH($var)
CASE(1)
   действие_1()
   действие_2()
   действие_8()
CASE(2)
   действие_7()
   действие_19()
   действие_12()
   действие_20()
END_SWITCH

GOTO(start)
[/spoiler]

Tamago4aRUS

  • Освоившийся
  • **
  • Posts: 32
    • View Profile
Re: Подскажите команду
« Reply #8 on: August 31, 2017, 01:44:29 AM »

А если серьезно, то прежде чем ответить на вопрос, нужно видеть сам скрипт. Что за цикл, и с какой "определённой строчки" он должен продолжить свою работу если какое(?)-то условие в этом цикле не выполняется?
[/quote]
Если за 10 секунд на рабочем столе всё ещё находится картинка 1.bmp то скрипт кликнет в опр. место подождёт секунд 15 и начнёт скрипт с 1 строчки. но писать мне готовый скрипт не надо, я и сам могу. я шарю. только не совсем понял как метку ставить

Tamago4aRUS

  • Освоившийся
  • **
  • Posts: 32
    • View Profile
Re: Подскажите команду
« Reply #9 on: August 31, 2017, 01:52:51 AM »
Короче куча ответов, кто-то обсерает GOTO кто-то говорит что это для элиты, но никто не представляет альтернативных вариантов + никто так и не смог объяснить что плохого в использовании GOTO.
« Last Edit: August 31, 2017, 09:56:56 AM by Oraven »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подскажите команду
« Reply #10 on: August 31, 2017, 08:56:31 AM »
+ никто так и не смог объяснить что плохого в использовании GOTO.
Что прям никто не объяснил? Кратко: можешь напороться на ошибки выполнения, которые будешь искать долго и упорно и не факт, что найдёшь.

код мой кто-то не поймёт? да мне по*еру, я его пишу для себя а не для кого-то
Ты не поймёшь. Ты лично, свой код, через пол года, когда понадобится его изменить.
Нет, конечно, если скрипт в 100, 300, 500 строк, то картина в целом всё ещё помещается в голове. Когда будет 3000 строк или больше, без чёткой организации любое внесение изменений требует всё больше времени. А с многочисленными GOTO отладка грозит превратится в ад и может никогда не закончится.

но никто не представляет альтернативных вариантов
Вариант: потоки. Передаёшь управление отдельному потоку, который временно или постоянно будет следить за нужным тебе признаком. При необходимости останавливаешь и перезапускаешь поток основного скрипта. Всё. Использовалось давно и неоднократно. Под это дело у разработчика, даже, "выбит" функционал.
А никто "не представляет", потому что ты не показываешь свой код. Мало радости догадываться что там у тебя и переделывать по сто раз, только потому, что тебе не хочется или лень показать код. Такого просто уже наелись.


Tamago4aRUS

  • Освоившийся
  • **
  • Posts: 32
    • View Profile
Re: Подскажите команду
« Reply #11 on: August 31, 2017, 08:00:13 PM »
А никто "не представляет", потому что ты не показываешь свой код. Мало радости догадываться что там у тебя и переделывать по сто раз, только потому, что тебе не хочется или лень показать код. Такого просто уже наелись.
всё дело в том что я кину код в 150 строк. А зачем мне что-то кидать, чтобы мне готовое решение сделали? Я сам может хочу научиться. Видишь ли, собрались тут, задачки решать.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подскажите команду
« Reply #12 on: September 01, 2017, 09:53:26 AM »
Код, возможно, объяснит понимание ситуации как у тебя все устроено. И решение подбирается под конкретный случай.
В общих чертах я уже написал как слелать. Минимум 2 потока. Часть кода требующая перезапуска - НЕ в главном потоке. Главным или 2-м второстепенным отслеживаем ситуацию и управляем первым потоком.


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Подскажите команду
« Reply #13 on: September 01, 2017, 06:58:28 PM »
Если не выполняется какое-то условие в цикле WHILE то скрипт как бы начинает воспроизводиться с определённой строчки.

Тело цикла выполняется только в том случае (и до тех пор), пока истинно логическое выражение, заданное в его описании как предусловие. И ничего с этим не поделать - таковы правила "игры". Если нужно выйти из цикла, не дожидаясь пока предусловие станет ложным, то нужно сделать его ложным принудительно, проверяя какое-то другое условие. Такое условие может быть как внутри данного цикла, так и вне его, например в другом потоке. И только после корректного выхода из цикла, можно переходить к выполнению нужной строки кода. В пределах одного уровня вложенности можно прыгнуть и через Goto, никто не запрещает. Получается, что конкретную команду в данном случае предложить не поучается, так как возможны варианты. Но этой командой станет именно та, которая корректно завершит цикл. В примере ниже - это конструкция, которая проверяет содержимое буфера обмена и при обнаружении там единицы корректно завершает цикл, "подгоняя" содержимое буфера под такое, при котором цикл сам завершится. А уж как продолжить скрипт с нужной строки кода, посоветовать можно только зная задачу. Вот. :)

Code: (clickermann) [Select]
LOGCLEAR

TOCLIP("999")

WHILE(FROMCLIP() ! "0")
   
   // какие-то полезные действия
   
   IF(FROMCLIP() = "1") // запасной выход из цикла - если в буфере обмена будет единица
   
      LOGWRITE ("-------------")
      LOGWRITE ("В буфере обмена - ", FROMCLIP(), " - экстренный выход из цикла")
      LOGWRITE ("Принудительно делаем предусловие цикла ложным (копируем в буфер обмена ноль)")
      TOCLIP("0") // копируем в буфер обмена ноль
      LOGWRITE ("Теперь в буфере обмена - ", FROMCLIP(), " - цикл сам корректно завершится")
     
   ELSE
      LOGWRITE ("В буфере обмена - ", FROMCLIP())
      WAITMS(500)
   END_IF
   
END_CYC

LOGWRITE ("В буфере обмена - ", FROMCLIP(), " - переходим к другим действиям")

HALT