Author Topic: GOTO в SUB и INCLUDE  (Read 5368 times)

0 Members and 2 Guests are viewing this topic.

nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
GOTO в SUB и INCLUDE
« on: September 14, 2022, 12:49:01 PM »
есть ли возможность подтягивать один и тот же внешний скрипт с GOTO в разных частях основного сценария ??

пробовал через SUB и INCLUDE , но ловлю глюки из-за того, что основной скрипт похоже генерирует все подпрограммы и инклуды и путается, так как имеем одинаковых таргетов по GOTO множество в разных местах.

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #1 on: September 14, 2022, 05:09:01 PM »
есть ли возможность подтягивать один и тот же внешний скрипт с GOTO в разных частях основного сценария ??
В разных - нет. Метки же будут дублироваться.

Нужно импортировать в подпрограмму, а уже её вызывать по скрипту. Или этот внешний скрипт сразу оформить в виде подпрограммы.
Без кода неясно как там пытался сделать.



nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #2 on: September 14, 2022, 06:12:54 PM »
я пытался и инклудом и подпрограмой - результат один и тот же - глюк

часть основного сценария (выше в сценарии есть похожие места с похожими внешними файлами и одинаковыми названиями GOTO)
Code: [Select]
t6-8:
#include "\bl\t+2Kpdrdpr.cms"
#include "bl\sld48.cms"

GETSCREEN(624, 288, 851, 616)
IF_PICTURE_IN(624, 288, 851, 616, "\pict\001.bmp", -1, 60)
   MOVE($_return1, $_return2)
   WAIT(1)
ELSE
   #include "bl\plznv.cms"
   GOTO(bgn1)
END_IF

GETSCREEN(624, 288, 851, 616)
COLORMODE(8, 624, 288, 851, 616)
IF_PICTURE_IN(624, 288, 851, 616, "\pict\06.bmp", -1, 98)
   #include "\bl\t+2Kpdrdpr.cms"
   #include "bl\plznv.cms"
ELSE
   #include "bl\plznv.cms"
END_IF
GOTO(bgn1)

часть файла t+2Kpdrdpr.cms
Code: [Select]
//1-1
GETSCREEN
IF_PICTURE_IN(624, 317, 680, 367, "\pict\001.bmp", -1, 60)
GOTO(1h1)
ELSE
GOTO(1h-2)
END_IF
1h1:
FOR($a=0, $a < 2)
MOVE(1013,831)
WAITMS(201)
LDOWN(1013,831)
WAITMS(99)
LUP(1013,831)
WAITMS(1501)
MOVE(652,343)
WAITMS(201)
LDOWN(652,343)
WAITMS(500)
MOVER(10,10)
WAITMS(201)
MOVE(1059,467)
WAITMS(201)
LUP(1059,467)
WAITMS(101)
MOVE(1014,740)
WAITMS(101)
LDOWN(1014,740)
MOVER(10,10)
WAITMS(102)
MOVE(1016,477)
WAITMS(103)
LUP(1016,477)
WAITMS(104)
MOVE(974,577)
WAITMS(902)
LDOWN(974,577)
WAITMS(99)
LUP(974,577)
WAITMS(4701)
GETSCREEN
IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
GOTO(1h-2)
END_IF
END_CYC
//1-2
1h-2:
GETSCREEN
IF_PICTURE_IN(664, 317, 716, 367, "\pict\001.bmp", -1, 60)
GOTO(1h2)
ELSE
GOTO(1h-3)
END_IF
1h2:
FOR($a=0, $a < 2)
MOVE(1013,831)
WAITMS(201)
LDOWN(1013,831)
WAITMS(99)
LUP(1013,831)
WAITMS(1501)
MOVE(691,343)
WAITMS(201)
LDOWN(691,343)
WAITMS(500)
MOVER(10,10)
WAITMS(201)
MOVE(1059,467)
WAITMS(201)
LUP(1059,467)
WAITMS(101)
MOVE(1014,740)
WAITMS(101)
LDOWN(1014,740)
MOVER(10,10)
WAITMS(102)
MOVE(1016,477)
WAITMS(103)
LUP(1016,477)
WAITMS(104)
MOVE(974,577)
WAITMS(902)
LDOWN(974,577)
WAITMS(99)
LUP(974,577)
WAITMS(4701)
GETSCREEN
IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
GOTO(1h-3)
END_IF
END_CYC
//1-3
1h-3:
GETSCREEN
IF_PICTURE_IN(704, 317, 752, 367, "\pict\001.bmp", -1, 60)
GOTO(1h3)
ELSE
GOTO(1h-4)
END_IF
1h3:
FOR($a=0, $a < 2)
MOVE(1013,831)
WAITMS(201)
LDOWN(1013,831)
WAITMS(99)
LUP(1013,831)
WAITMS(1501)
MOVE(727,343)
WAITMS(201)
LDOWN(727,343)
WAITMS(500)
MOVER(10,10)
WAITMS(201)
MOVE(1059,467)
WAITMS(201)
LUP(1059,467)
WAITMS(101)
MOVE(1014,740)
WAITMS(101)
LDOWN(1014,740)
MOVER(10,10)
WAITMS(102)
MOVE(1016,477)
WAITMS(103)
LUP(1016,477)
WAITMS(104)
MOVE(974,577)
WAITMS(902)
LDOWN(974,577)
WAITMS(99)
LUP(974,577)
WAITMS(4701)
GETSCREEN
IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
GOTO(1h-4)
END_IF
END_CYC
и дальше ещё 2000+ строк кода но они похожи

глюк при таком раскладе начинался уже на первом проходе
Code: [Select]
IF_PICTURE_IN(624, 288, 851, 616, "\pict\06.bmp", -1, 98)
   #include "\bl\t+2Kpdrdpr.cms"

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

пробовал через подпрограмму

описание в самом начале сценария штук 5 как ниже
Code: [Select]
sub(2Kpdrdpr)
#include "\bl\t+2Kpdrdpr.cms"
end_sub

и потом вызов
Code: [Select]
2Kpdrdpr()
но также сбоит и с такими же симптомами как и по инклуду
« Last Edit: September 14, 2022, 06:17:35 PM by nolek »

kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
Re: GOTO в подпрограммах и циклах!
« Reply #3 on: September 14, 2022, 11:49:21 PM »
Если до этого простое правило, не выскакивать из циклов и подпрограмм с помощью GOTO, вы могли тупо игнорировать, то теперь можете практически  наблюдать, почему этого делать нельзя. :o

nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #4 on: September 14, 2022, 11:57:56 PM »
GOTO из циклов работает без нареканий и к поднятой проблеме прямого отношения не имеет, из подпрограмм выхода по GOTO у меня нет.

при назначении уникального таргета по GOTO у меня проблем нет.

суть вопроса можно ли как-то изолировать от общего сценария отдельный скрипт подтягиваемый по инклуду или изолировать подпрограмму, например выполнили подпрограмму и основной сценарий не держит её в памяти.

kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
суть вопроса можно ли как-то изолировать от общего сценария отдельный скрипт подтягиваемый по инклуду или изолировать подпрограмму, например выполнили подпрограмму и основной сценарий не держит её в памяти.
Конечно можно.
 Потоки и проверка условий  в этом помогут.
 Если, ты такой щепетильный к сути, каким хочешь казаться, то используй последовательное открытие и закрытие скриптов в отдельных копиях программы и команды удаления переменных из памяти программы.

nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #6 on: September 15, 2022, 12:49:28 PM »
у меня нет переменных которым что-то присвоено - удалять нечего

последовательное открытие скриптов - это как ? или как их можно открыть паралельно ?

суть проблемы, что Clickermann.exe генерирует весь сценарий при открытии, то есть инклуды и подпрограммы все превращаются в единый сценарий, который хранится в памяти, и меня интересует есть ли какая то возможность очистить какую-то часть памяти, после исполнения, как очистка переменных, только к куску кода, пока что я не смог найти как.

Сейчас у меня мой вопрос решён уникальными таргетами по GOTO - через генерацию рэндом числа в диапазоне, но есть риск, что сгенерируется одинаковое число, и тогда сценарий словит глюк, запоминать переменные и писать проверку каждой  на совпадение тоже не хочу, а вот если очистить из памяти сценария часть кода, тогда и уникальных таргетов ненадо и сценарий будет без глюков.

если у вас есть решение - покажите на участке кода, который я привёл выше в постах.

UPD
1) почитал про потоки, - в моём случае не вариант, слишком ресурсоёмкое.
2) отказался от генерации рэндом числа в диапазоне для уникальных таргетов GOTO, глючит почему-то, перезаписал вручную таргеты всё заработало как часы.

« Last Edit: September 16, 2022, 12:26:40 AM by nolek »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #7 on: September 16, 2022, 09:52:18 AM »
суть проблемы, что Clickermann.exe генерирует весь сценарий при открытии, то есть инклуды и подпрограммы все превращаются в единый сценарий, который хранится в памяти, и меня интересует есть ли какая то возможность очистить какую-то часть памяти, после исполнения, как очистка переменных, только к куску кода, пока что я не смог найти как.
Нет такой возможности. При правильном построении скрипта, это и не нужно.

Сейчас у меня мой вопрос решён уникальными таргетами по GOTO - через генерацию рэндом числа в диапазоне, но есть риск, что сгенерируется одинаковое число, и тогда сценарий словит глюк, запоминать переменные и писать проверку каждой  на совпадение тоже не хочу, а вот если очистить из памяти сценария часть кода, тогда и уникальных таргетов ненадо и сценарий будет без глюков.
Ты не показал подробно как сделал через подпрограммы. Если инклюдит 1 раз - проблем быть не должно.

если у вас есть решение - покажите на участке кода, который я привёл выше в постах.

Проще чем перезапускать скрипты и плодить потоки сделать через подпрограмму.
Ещё правильней - избавиться от GOTO, тем более, что оно здесь совсем не нужно
файл t+2Kpdrdpr.cms
Code: (clickermann) [Select]
//1-1
GETSCREEN
IF_PICTURE_IN(624, 317, 680, 367, "\pict\001.bmp", -1, 60)
    FOR($a=0, $a < 2)
        MOVE(1013,831)
        WAITMS(201)
        LDOWN(1013,831)
        WAITMS(99)
        LUP(1013,831)
        WAITMS(1501)
        MOVE(652,343)
        WAITMS(201)
        LDOWN(652,343)
        WAITMS(500)
        MOVER(10,10)
        WAITMS(201)
        MOVE(1059,467)
        WAITMS(201)
        LUP(1059,467)
        WAITMS(101)
        MOVE(1014,740)
        WAITMS(101)
        LDOWN(1014,740)
        MOVER(10,10)
        WAITMS(102)
        MOVE(1016,477)
        WAITMS(103)
        LUP(1016,477)
        WAITMS(104)
        MOVE(974,577)
        WAITMS(902)
        LDOWN(974,577)
        WAITMS(99)
        LUP(974,577)
        WAITMS(4701)
        GETSCREEN
        IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
            $a = 100
        END_IF
    END_CYC
END_IF

//1-2
GETSCREEN
IF_PICTURE_IN(664, 317, 716, 367, "\pict\001.bmp", -1, 60)
    FOR($a=0, $a < 2)
        MOVE(1013,831)
        WAITMS(201)
        LDOWN(1013,831)
        WAITMS(99)
        LUP(1013,831)
        WAITMS(1501)
        MOVE(691,343)
        WAITMS(201)
        LDOWN(691,343)
        WAITMS(500)
        MOVER(10,10)
        WAITMS(201)
        MOVE(1059,467)
        WAITMS(201)
        LUP(1059,467)
        WAITMS(101)
        MOVE(1014,740)
        WAITMS(101)
        LDOWN(1014,740)
        MOVER(10,10)
        WAITMS(102)
        MOVE(1016,477)
        WAITMS(103)
        LUP(1016,477)
        WAITMS(104)
        MOVE(974,577)
        WAITMS(902)
        LDOWN(974,577)
        WAITMS(99)
        LUP(974,577)
        WAITMS(4701)
        GETSCREEN
        IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
            $a = 100
        END_IF
    END_CYC
END_IF

//1-3
GETSCREEN
IF_PICTURE_IN(704, 317, 752, 367, "\pict\001.bmp", -1, 60)
    FOR($a=0, $a < 2)
        MOVE(1013,831)
        WAITMS(201)
        LDOWN(1013,831)
        WAITMS(99)
        LUP(1013,831)
        WAITMS(1501)
        MOVE(727,343)
        WAITMS(201)
        LDOWN(727,343)
        WAITMS(500)
        MOVER(10,10)
        WAITMS(201)
        MOVE(1059,467)
        WAITMS(201)
        LUP(1059,467)
        WAITMS(101)
        MOVE(1014,740)
        WAITMS(101)
        LDOWN(1014,740)
        MOVER(10,10)
        WAITMS(102)
        MOVE(1016,477)
        WAITMS(103)
        LUP(1016,477)
        WAITMS(104)
        MOVE(974,577)
        WAITMS(902)
        LDOWN(974,577)
        WAITMS(99)
        LUP(974,577)
        WAITMS(4701)
        GETSCREEN
        IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
            $a = 100
        END_IF
    END_CYC
END_IF

Т.к. действия однотипные, скрипт можно уменьшить больше, чем в 20 раз, с 2000 строк до < 100
Code: (clickermann) [Select]
SUB(pict001, $px1, $px2)
GETSCREEN
IF_PICTURE_IN($px1, 317, $px2, 367, "\pict\001.bmp", -1, 60)
    FOR($a=0, $a < 2)
        MOVE(1013,831)
        WAITMS(201)
        LDOWN(1013,831)
        WAITMS(99)
        LUP(1013,831)
        WAITMS(1501)

        MOVE($px1 + 27, 343)
        WAITMS(201)
        LDOWN($px1 + 27, 343)
        WAITMS(500)

        MOVER(10,10)
        WAITMS(201)
        MOVE(1059,467)
        WAITMS(201)
        LUP(1059,467)
        WAITMS(101)
        MOVE(1014,740)
        WAITMS(101)
        LDOWN(1014,740)
        MOVER(10,10)
        WAITMS(102)
        MOVE(1016,477)
        WAITMS(103)
        LUP(1016,477)
        WAITMS(104)
        MOVE(974,577)
        WAITMS(902)
        LDOWN(974,577)
        WAITMS(99)
        LUP(974,577)
        WAITMS(4701)
        GETSCREEN
        IF_PICTURE_IN(988, 431, 1043, 491, "\pict\cri.bmp", -1, 60)
            $a = 100
        END_IF
    END_CYC
END_IF

pict001(624, 680)
pict001(664, 716)
pict001(704, 752)

А если там нужно пробегаться по решётке или ячейкам в ряд - то задав правильно координаты сделать ещё меньше пробегаясь циклом.
« Last Edit: September 16, 2022, 09:54:58 AM by Vint »


nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #8 on: September 16, 2022, 11:51:43 PM »
спасибо за советы, сейчас буду ковырять, отпишусь как расковыряю, спасибо за потраченное время.

там ячейки в таблице 6х8 - пример я уже получил, буду адаптировать, за несколько дней думаю справлюсь
« Last Edit: September 16, 2022, 11:56:58 PM by nolek »

nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #9 on: September 19, 2022, 11:17:02 AM »
всем спасибо за отклик, избавился от GOTO, действительно тупанул, ведь переменная и есть переменная, присвоили значение больше чем условие цикла и мы выходим из цикла.. =))

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

Code: (clickermann) [Select]
// рабочий цикл
logshow(1, 100,100)
$1ax1 = 637 //тут стоит формула, но для примера поставил число
$1ay1 = 321
$6hx1 = $1ax1+216
$6hy1 = $1ay1+288


FOR($tby1=$1ay1, $tby1 < $6hy1-5, +36)
   FOR($tbx1=$1ax1, $tbx1 < $6hx1-5, +36)
      //вычисляем и присваиваем координаты ячейки, и всех остальных отталкиваясь от верхнего левого угла
      $tbx2 = $tbx1+36
      $tby2 = $tby1+36
     
      //тут тело скрипта действий с ячейкой
     
      logwrite($tbx1,$tby1)
      waitms(100)
   END_CYC
END_CYC
halt
« Last Edit: September 19, 2022, 11:19:07 AM by nolek »

kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #10 on: September 19, 2022, 12:22:42 PM »
названия переменных не начинайте с цифр, тогда они будут правильно подсвечиваться в графических редакторах.

nolek

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: GOTO в SUB и INCLUDE
« Reply #11 on: September 19, 2022, 04:59:11 PM »
главное чтоб скрипт работал, и в тех редакторах, которыми я пользуюсь всё подсвечивается нормально