Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ -Счётчик

Автор: Levo222 20.6.2020, 12:08

Как на Lua создать счетчик последовательного выполнения действия с присвоением каждому действию кликов координат? (с досрочным выходом из цикла в случае достижения макс числа)

code

Код
Local TCicleMax = 3 --максимальное кол-во
Count = Count + 1
local H1 = Kleft(100, 200) --первый контейнер
local H2 = Kleft(100, 300) --второй контейнер
local H3 = Kleft(100, 400) --третий контейнер

local h = findwindow("Containtg")
local t = os.clock()
While t > os.clock() do
  while Контейнер не полон (789, 9) ~= 9078784 do --Выполнять до тех пор пока контейнер не полон
    workwindow (h [1][1])
    hint ("Проверяю заполненность")
    wait (100)
    if  Контейнерполон (789, 9) == 9078785 --
    and что-то еще (10, 82) ~= 0  
    then
      hint ("Контейнер полон")
      alarm ("Контейнер полон.wav")
--но вот как узнать какой контейнер по счёту? потому что всего их 3. И если все 3 гонять по кругу это будет тупо.
      --Смотрим счётчик
      wait (10)
      --Если счётчик 3 (т.е. применялись H1, H2, H3)
      break --т.е. все 3 контейнера полны
   alarm ("Все контейнеры наполнены.wav")
    else --счетчик не 3
      --Проверка следующего контейнера--
      for i=1, #h do
        hint ("Открытие")
        workwindow (h[i][1])
        --drawtext(HNDL, '...\r\n...', 70, 300, 48, 'Segoe Print', 65279, 16000000)
        send217 ("5")
        wait (500)
--Здесь нужна какая-то функция открытия того контейнера, которыйне нажимался еще
        Kleft(Контейнер который не нажимался) --Т.е. H2/H3 второй/третий контейнер
        wait (500)
        send217 ("у")
        wait (1500)
        alarm ("Открытие контейнера.wav")
      end
    else
      hint ("Контейнер не заполнен")
      wait (200)
    end
  end
  alarm ("Завершение работы.wav")
  --log("Завершение работы")
  wait (500)

end

Если достигнуто TCicleMax, т.е. где-то в цикле уже прожимались H2 и H3 то цикл полностью завершает свою работу.
Т.е. важно чтобы скрипт помнил какие контейнеры он уже открывал, чтобы больше к ним не возвращаться.

Автор: cirus 20.6.2020, 13:01

Создать массив, в который записывать выполнялось ли действие. Принцип такой:

Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}
local count = {0, 1, 0}  -- изначально массив заполняем нулями, для примера действие 2 уже выполнено

log 'clear'  log 'mode compact'
for i=1, 3 do
    if count [i] == 0 then  -- если действие ещё не выполнялось
        -- тут какое-то условие, если истина, то выполнить действие
        log (H[i][1], H[i][2])
        count[i] = 1  -- записываем что он выполнено
    end
end

Автор: Levo222 20.6.2020, 14:23

Цитата(cirus @ 20.6.2020, 17:01) *

Создать массив, в который записывать выполнялось ли действие. Принцип такой:
Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}
local count = {0, 1, 0}  -- изначально массив заполняем нулями,

log 'clear'  log 'mode compact'
for i=0, 3 do
    if count [i] == 0 then  -- если действие ещё не выполнялось
        -- тут какое-то условие, если истина, то выполнить действие
        log (H[i][1], H[i][2])
        count[i] = 1  -- записываем что он выполнено
    end
end





Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}

local count = {0, 1, 0}  -- изначально массив заполняем нулями, для примера действие 2 уже выполнено

log 'clear'  log 'mode compact'
for i=0, 3 do
    if count [i] == 0 then  -- если действие ещё не выполнялось
        -- тут какое-то условие, если истина, то выполнить действие
        log (H[i][1], H[i][2])
        count[i] = 1  -- записываем что он выполнено
    end
end

как её проверить? Чтобы массив последовательно перебрался?

Автор: cirus 20.6.2020, 17:21

Цитата
Чтобы массив последовательно перебрался?

Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}

log 'clear'  log 'mode compact'

for i=1, #H do
    log (H[i][1], H[i][2])
end

Автор: Levo222 20.6.2020, 21:37

Цитата(cirus @ 20.6.2020, 21:21) *

Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}

log 'clear'  log 'mode compact'

for i=1, #H do
    log (H[i][1], H[i][2])
end


Я имел ввиду как действием нажать те координаты, которые еще не нажимались?

Автор: cirus 20.6.2020, 21:45

Цитата
как действием нажать те координаты

Вместо log использовать move.

Автор: Levo222 20.6.2020, 22:02

Цитата(cirus @ 21.6.2020, 1:45) *

Вместо log использовать move.

Всё работает вродебы.
Или нет. НиX@я не работает.

Автор: cirus 20.6.2020, 22:21

Цитата
Тогда нажимаются сразу 2, мне одно надо нажать

break для выхода из цикла.

Автор: Levo222 20.6.2020, 22:44

Цитата(cirus @ 21.6.2020, 2:21) *

break для выхода из цикла.

Тут вот какая проблема, переменная count видна только внутри того цикла for в котром рассчитывается, а когда я выношу её за цикл, то она выдаёт ошибку

Автор: cirus 20.6.2020, 22:51

Цитата
переменная count видна только внутри того цикла for в котром рассчитывается

Объявить её до цикла да и всё.

Автор: Levo222 20.6.2020, 23:19

Цитата(cirus @ 21.6.2020, 2:51) *

Объявить её до цикла да и всё.

Как инициировать полную остановку скрипта?
А то у меня столько breakov получилось, что не поймёшь какой из-них куда ведёт.
В идеале то конечно goto каким-то образом применить, но он вроде не работает?

Если я напишу
Код
if 1 then
1
  else
if 2 then
   2
  else
   if 3 then
    break
   else
   end
end
end

То break выведет скрипт и из двух последних End тоже? Или так и будет гонять их по кругу?

Автор: cirus 20.6.2020, 23:36

Цитата
Как инициировать полную остановку скрипта?

Код
end_script()

Автор: Levo222 20.6.2020, 23:51

Цитата(cirus @ 21.6.2020, 3:36) *

Код
end_script()


Так, а теперь есть скрипт чтобы инициировать очистку мозгов с рабочего стола от разрыва головы пока я писал скрипт?


Автор: cirus 21.6.2020, 0:02

Цитата
То break выведет скрипт и из двух последних End тоже?

break прерывает цикл.

Автор: Levo222 21.6.2020, 0:04

Цитата(cirus @ 21.6.2020, 4:02) *

break прерывает цикл.

То есть в if он не будет работать и сразу выведет за ближайший end "while/for"?

--Upd--
Кажется я знаю зачем придумали
Код
Repeat

Автор: Levo222 21.6.2020, 0:42

почему мне

Код
log (count[i])

Выдаёт nil?
Как его проверить?

Автор: cirus 21.6.2020, 0:47

Цитата
Выдаёт nil?

Значит нет такой переменной.

Автор: Levo222 21.6.2020, 0:49

Мне надо чтобы гоняло цикл пока count полностью не будет перебран

Цитата(cirus @ 21.6.2020, 4:47) *

Значит нет такой переменной.

Так и count[H] тоже выдаёт nil

МММ угу

Автор: cirus 21.6.2020, 0:56

Цитата
Так и count[H] тоже выдаёт nil

Ответ тот же.
Цитата
Мне надо чтобы гоняло цикл пока count полностью не будет перебран

Где скрипт?

Автор: Levo222 21.6.2020, 1:00

Цитата(cirus @ 21.6.2020, 4:56) *

Где скрипт?

Вроде дошло
Цитата


Код

while count[i] = 0 do

end

Автор: Levo222 21.6.2020, 1:16

еще одна проблема

Код

Угу

Если одно окно выпало, то скрипт споткнётся на таком коде, как проверить в этом же цикле существование каждого из них?

Автор: cirus 21.6.2020, 1:29

Цитата
workwindow (W[i][1], W[i][2], W[i][3], W[i][4], W[i][5], W[i][6])

Что это за бред. Можно только одно окно сделать рабочим.
Код
for i=0, 6 do

В луа индексация массива начинается с 1.
Цитата
как проверить в этом же цикле существование каждого из них?

Код
--lua
local W = {111, 222, nil, 444}

for i=1, #W do
    if W[i] then
        log (W[i])
    end
end

Автор: Levo222 21.6.2020, 1:41

ууууууууууууууууууу

Автор: cirus 21.6.2020, 1:47

Цитата
Тоже самое что и это:
move (H[i][1], H[i][2])

С такой логикой если будет 50 окон, то в функцию будете передавать 50 параметров? Хоть немного-то думать надо.

Автор: Levo222 21.6.2020, 2:08

Цитата(Levo222 @ 21.6.2020, 5:41) *

Код
workwindow (W[i][1], W[i][2], W[i][3], W[i][4], W[i][5], W[i][6])

Бред.

Тогда как мне следующее окно то из таблицы тыкнуть?

Автор: Levo222 21.6.2020, 2:49

l;kj;lk'l

Автор: Levo222 21.6.2020, 5:46

Цитата(cirus @ 21.6.2020, 1:45) *

Вместо log использовать move.

Почему для
Код
 log (H[i][1], H[i][2])
А так мы координаты передавали или # переменной, чё-т оя не понял?
move годится

А workwindow нет?

Так то одновременно и мышь не может в 2-х точках находится, как и workwindow быть привязанным к 2-м окнам.

Цитата(cirus @ 21.6.2020, 5:47) *

то в функцию будете передавать 50 параметров?

А что с ней от этого будет? С функцией? Она же неживая) Вытерпит и 100 параметров

Автор: Levo222 21.6.2020, 9:51

Вобщем ошибка такая:
43:

Код
attemp to compare number with table

А с этим я разобрался. Правда у меня цикл счетчика на 3 круга проверяет. Не могу понять почему так

и почему-то
Код
Kleft (H[i][1], H[i][2])


не работает
Ну хоть left работает. Х с ним

Автор: cirus 21.6.2020, 10:19

Код
не работает 

Кусок кода не может работать.
Цитата
Так то одновременно и мышь не может в 2-х точках находится, как и workwindow быть привязанным к 2-м окнам

Точка это 2 координаты, поэтому move принимает 2 параметра.

Автор: Levo222 21.6.2020, 10:53

Вот это вот не работает почему-то?

Исходный код
local w1 = findwindow("W1")
local w2 = findwindow("W2")
local w3 = findwindow("W3")
local w4 = findwindow("W4")
local w5 = findwindow("W5")
local w6 = findwindow("W6")
local W = {w1, w2, w3, w4, w5, w6}
local Wcount = {0, 0, 0, 0, 0, 0}
function ActivW(x, y) return(color (x, y)) end -- (317, 81) == 0 --Другие окна
alarm ("Начинаю процедуру выхода.wav")
for k=1, #W do
if W[k] then
log (W[k])
while Wcount[e] == 0 do
for e=0, 6 do
hint ("Выхожу")
workwindow (W[e][1])
if ActivW(317, 81) == 0 then --окно активно
--Глушим его
send217 ("5")
alarm ("выхожу.wav")
else
Wcount[e] = 1 -- записываем если неактивно
hint ("Окно неактивно")
end
end
end
else
msg ("Окно W[e]) не найденоВозможно оно потеряноХотите вернуть его состояние?")
--и присваеваем потерявшемуся окну 1 в счетчике, чтобы его больше не искало
wait (200)
Wcount[e] = 1
end
end
end

Автор: cirus 21.6.2020, 11:23

Цитата
while Wcount[e] == 0 do

Переменная e не объявлена.
Цитата
for e=0, 6 do

С 1 надо начинать цикл.

Автор: Levo222 21.6.2020, 15:00

Цитата(cirus @ 21.6.2020, 15:23) *

Переменная e не объявлена.

Код

while Wcount[e] == 0 do
                for e=0, 6 do
                workwindow (W[e][1])
                    if ActivW(317, 81) == 0 then --окно активно
                    send217 ("5")
                    alarm ("выхожу.wav")
                    else
                    Wcount[e] = 1  -- записываем если неактивно
                    hint ("Окно неактивно")
                    end
                end
            end

Ну так как его объявить чтобы этот цикл был бесконечным до for а не после?

Автор: cirus 21.6.2020, 15:26

Опишите что вообще надо сделать. Или предлагаете по коду с ошибками догадываться?

Автор: Levo222 21.6.2020, 15:45

Цитата(cirus @ 21.6.2020, 19:26) *

Опишите что вообще надо сделать. Или предлагаете по коду с ошибками догадываться?

Так я уже тут 10 раз писал. Нужно пачку окон закрыть если они существуют вообще, но в цикле перебора их имён

Эм. ну ладно, а так будет работать?

Исходный код
local w1 = findwindow("W1")
local w2 = findwindow("W2")
local w3 = findwindow("W3")
local w4 = findwindow("W4")
local w5 = findwindow("W5")
local w6 = findwindow("W6")
local W = {w1, w2, w3, w4, w5, w6}
local Wcount = {0, 0, 0, 0, 0, 0}
function ActivW(x, y) return(color (x, y)) end -- (317, 81) == 0 --если окна активны
alarm ("выход.wav")
for k=1, #W do --цикл для каждого окна из таблицы W
if W[k] then -- если каждое из них существует
log (W[k])

for e=0, 6 do --то перебираем каждое из них и закрываем
while Wcount[e] == 0 do --пока какое-то окно из W активно
hint ("Выхожу")
workwindow (W[e][1])
if ActivW(317, 81) == 0 then --если окно активно
--Глушим его
send217 ("5")
alarm ("выхожу.wav")
else
Wcount[e] = 1 -- записываем что неактивно
hint ("Окно неактивно")
end
end
end
else -- если окно не найдено
msg ("Окно W[e]) не найденоВозможно оно потеряноХотите вернуть его состояние?")
--и присваеваем потерявшемуся окну 1 в счетчике, чтобы его больше не искало
wait (200)
Wcount[e] = 1
end
end
end

Я конечно могу на каждое окно писать 20+ строк закрытия, но чёт мне кажется так покомпактнее будет
А зачем вообще использовать for в таком случае? Если можно использовать if и бесконечный цикл внутри него на проверку истинности этого if?
А счётчик же нужен...

Автор: cirus 21.6.2020, 16:39

Цитата
А счётчик же нужен

Зачем? Findwindow возвращает массив, размер которого известен.

Автор: Levo222 21.6.2020, 17:09

Цитата(cirus @ 21.6.2020, 20:39) *

Зачем? Findwindow возвращает массив, размер которого известен.

То есть мне что-то выше поставить?

Вот так чтоли?
Код
local W = {w1, w2, w3, w4, w5, w6}
local Wcount = {0, 0, 0, 0, 0, 0}
local w1 = findwindow("W1")
  local w2 = findwindow("W2")
  local w3 = findwindow("W3")
  local w4 = findwindow("W4")
  local w5 = findwindow("W5")
  local w6 = findwindow("W6")

Автор: cirus 21.6.2020, 18:48

Цитата
Нужно пачку окон закрыть если они существуют вообще, но в цикле перебора их имён

Код
--lua
local WM_CLOSE = 0x0010
local window_name = {'Блокнот', 'Калькулятор', 'Lineage2'}    -- имена окон

log 'clear'  log 'mode compact'

for i=1, #window_name do
    local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then
        log('Найдено окон: ' .. tostring(#W))
        for j=1, #W do
            sendmessage (W[j][1], WM_CLOSE, 0, 0)     -- закрыть окно
        end
    else
        log('Найдено окон: 0')
    end
    log()
end

Автор: Levo222 22.6.2020, 8:34

Мда. Туплю сегодня. Только понял что for i=0 вызывал лишний круг проверки таблицы

Как точно определить на каком шаге находится в данный момент цикл "for c=1, 3 do"?

Автор: cirus 22.6.2020, 10:01

Цитата
Как точно определить на каком шаге находится в данный момент цикл "for c=1, 3 do"?

Вывести в лог переменную c.

Автор: Levo222 27.6.2020, 4:07

Цитата(cirus @ 22.6.2020, 14:01) *

Вывести в лог переменную c.

Я имел ввиду порядковый номер в цикле for, а не его значение.

Автор: Levo222 27.6.2020, 4:56

Цитата(cirus @ 21.6.2020, 22:48) *

Код
--lua
local window_name = {'Блокнот', 'Калькулятор', 'Lineage2'}    -- имена окон

log 'clear'  log 'mode compact'

for i=1, #window_name do
    local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then
        log('Найдено окон: ' .. tostring(#W))
        for j=1, #W do
            send (x)     -- Тут не совсем закрыть окно, а убрать в нём признаки жизни - там есть специальные клавиши
        end
    else
        log('Найдено окон: 0')
    end
    log()
end



И вот теперь мне снизу понадобилось обратно активировать их, чтобы после паузы продолжить работу:
Код
--lua
local window_name = {'Блокнот', 'Калькулятор', 'Lineage2'}    -- имена окон

log 'clear'  log 'mode compact'

for i=1, #window_name do
    local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then
        log('Найдено окон: ' .. tostring(#W))
        for j=1, #W do
            send (x)     -- вернуть обратно активность окну
        end
    else
        log('Найдено окон: 0') --у меня ощущение, что else должна стоять после end - for j=1, #W do... что-то тут не так?
    end
    log()
end


Мне нужно перед новым циклом for обнулять переменную i? Или она не видна уже в этом пространстве?

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

--------- Короче он ошибку выдаёт, если не находит достаточное количество окон.
пишет Table index is nil

П.С.: Можно как-то изменить дефолт расположения звуков проигрываемым пилотом? А то там такая музыкальная коллекция собралась, что ничего другого не видно уже.

Автор: cirus 27.6.2020, 11:42

Цитата
обнулять переменную i? Или она не видна уже в этом пространстве?

Вывести значение переменной в лог и посмотреть.
Цитата
Короче он ошибку выдаёт

Где скрипт, который выдаёт такую ошибку?

Автор: Levo222 28.6.2020, 5:55

Цитата(cirus @ 27.6.2020, 15:42) *

Где скрипт, который выдаёт такую ошибку?

Вобщем нагородил говна, а в какой очередности его воспроизводить незнаю.

-

Код
--lua
log 'clear'  log 'mode compact'
----------------Convert_Time---------------
function time (t)
  local m = math.floor( (math.floor(t) % 3600) / 60)
  local s = (math.floor(t) % 3600) % 60
  return string.format("%02d:%02d", m, s)
end
--- FIX --------
  end
end

Вобщем есть 3 основных параметра в которые упирается скрипт - Это
1. Оставшееся время
2. Заполненность всех контейнеров(их разрушение индентично заполненности)
3. И проверка текущего статуса Окна(Т.е. идентификация что мы и где мы)
При любом нарушении условий одного из этих параметров должен происходить выход.
Но в то же время внутри них должен находиться рабочий цикл

Я взял за основу время

Код
while t > os.clock() do

end --while t > os.clock() do


И в него поместил счетчик событий

Код
while t > os.clock() do
for forcount=1, 3 do
      log (count[forcount])
      if  count [forcount] == 0 then
        left (H[forcount][1], H[forcount][2])
        --если нету свободных (все count = 1)
        break --выход из for и далее цикл процесса
      end --
end

end --while t > os.clock() do


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

Код

while t > os.clock() do
if WindowLoad (441, 561) == 3026224
for forcount=1, 3 do
      log (count[forcount])
      if  count [forcount] == 0 then -- если какой-то контейнер пуст
        --Выбор (H[forcount][1], H[forcount][2])
        break --выход из for в случае и далее цикл процесса
else --текущий контейнер полон???
      end --
else
end
end
while 1 do -- основной рабочий процесс
--в случае нарушения каких-либо параметров из него выкидывает
if u = 0 then
break
else
end
end
end --while t > os.clock() do

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

Автор: cirus 28.6.2020, 10:45

Цитата
Вобщем нагородил

Надо не городить, а понимать что в каком порядке должно выполняться.
Цитата
if count == {0, 0, 0} then

Это что?

Автор: Levo222 28.6.2020, 11:00

Цитата(cirus @ 28.6.2020, 14:45) *

Код
if count == {0, 0, 0} then

Это что?

А, одно = лишнее)) Исправил
А вот и не лищнее. Это проверка наличия свободных контейнеров при запуске скрипта.

Но там не в этом проблема, а в том что цепочка циклов запуталась.

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

Цитата(cirus @ 28.6.2020, 14:45) *

Надо не городить, а понимать что в каком порядке должно выполняться.

Было бы чем понимать.

Автор: Levo222 29.6.2020, 7:11

Не могу понять,
Вот такая конструкция:

Код

while do

if then
else
end

if then
else
end

end


Не работает чтоли?

Цитата(cirus @ 28.6.2020, 14:45) *

if count == {0, 0, 0} then
Это что?

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

Автор: cirus 29.6.2020, 11:05

Цитата
Вот такая конструкция:
Не работает чтоли?

Работает.
Цитата
А разве таким образом нельзя получать состояние переменных в таблице?

Нет.

Автор: Levo222 5.7.2020, 2:13

Код
   local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then

Что означает в данном случае if W then ?
Если окно существует? Но ведь это может означать и = 0, и > 0, и > 10, Это ведь не точная команда?

Автор: cirus 5.7.2020, 2:24

Цитата
Что означает в данном случае if W then ?

Тоже самое что:
Код
if W ~= nil then

Автор: Fors1k 5.7.2020, 2:27

Цитата(Levo222 @ 5.7.2020, 2:13) *
if W then ?

Это выражение срабатывает, если W не nil.
Это выражение срабатывает, если W не false.
Код
--lua
a = 4
c = 7 > 3
if a then log("А существует") end
if b then log("В существует") end
if c then log("Выражение 'С' истинно") end

Автор: Levo222 5.7.2020, 2:37

У меня постоянно вылазит ошибка

Цитата
"#строки: 'end' expected (to close if at line #строки) near 'log'

Хотя все endы на месте и циклы закрыты. Что ему надо-то? Не пойму.

Автор: cirus 5.7.2020, 2:44

Цитата
постоянно вылазит ошибка

Если пишет значит есть ошибка. Выкладывайте код или ищите ошибку.

Автор: Levo222 5.7.2020, 11:29

Цитата(cirus @ 5.7.2020, 6:44) *

Если пишет значит есть ошибка. Выкладывайте код или ищите ошибку.


Ну Вот:

8
Код

--lua
log 'clear'  log 'mode compact'
----------------Convert_Time---------------
function time (t)
  local m = math.floor( (math.floor(t) % 3600) / 60)
  local s = (math.floor(t) % 3600) % 60
  return string.format("%02d:%02d", m, s)
end
do

-------------------Контейнеры----------------
--local H = {{693, 78}, {696, 262}, {685, 451}} --
local H = {{696, 120}, {692, 404}, {704, 491}} --
local window_name = {'W1', 'W2', 'W3', 'W4', 'W5', 'W6'} --ОКНА

local count = {0, 0, 0}
-----------------------------------------------------------
log 'clear'  log 'mode compact'
----------------time--------------------
local minute = 2.1  -- х.х
local t = os.clock() + minute * 60
-----------------------------------------
----------------Window---------------------
local h = findwindow("W0")
local w1 = findwindow("W1")
local w2 = findwindow("W2")
local w3 = findwindow("W3")
local w4 = findwindow("W4")
local w5 = findwindow("W5")
local w6 = findwindow("W6")
-------------------Spot_x----------------------
function HC(x, y) return(color (x, y)) end
function NС(x, y) return(color (x, y)) end

function D(x, y) return(color (x, y)) end  
function D1(x, y) return(color (x, y)) end

function IW(x, y) return(color (x, y)) end
function IW1(x, y) return(color (x, y)) end

function PS(x, y) return(color (x, y)) end
function AW(x, y) return(color (x, y)) end

function WL(x, y) return(color (x, y)) end
function WL2(x, y) return(color (x, y)) end
----------------------------------------------------
workwindow (h [1][1])
------------- -------------------------
--if (H[1][1], H[1][2]) == (696, 120) then
--else (H[1][1], H[1][2]) ==  (693, 78) then
--end
--------------------------------------------------------
end --do

------------------- СТАТУС--------------------------------
while t > os.clock() do
if h > 0 then
log ("окно существует")
  alarm ("Проверяю загрузку.wav")
  if IW (10, 100) ~= 0 --НЕ загружен

  then
  log ("Не загружен")
    if D (58, 575) == 0
    and D1 (408, 572) == 1250075
    then
      log ("Сбой")
      ---------------------------Выключение окон --------------------
      for i=1, #window_name do
        local W = findwindow(window_name[i])
        log('Имя окна: ' .. window_name[i])
        if W then
          log('Найдено окон: ' .. tostring(#W))
          for j=1, #W do
            if ActivW(317, 81) == 0 then --окно активно
              send217 ("выключить")
            else
              Wcount[j] = 1  -- записываем если неактивно
              hint ("Окно неактивно")
            end
          end
        else
          log('Найдено окон: 0')
        end
      end
      break
    else
      end
  -----------------Список выбора--------------------------------------
  log ("Проверяю экран")
  if WL (441, 561) == 3026224
  and WL2 (134, 580) == 1054234
  then
    alarm ("Окно.wav")
    log ("Список")
    for forcount=1, 3 do
      log (count[forcount])
      if  count [forcount] == 0 then
        log (H[forcount][1], H[forcount][2])
        log (count[forcount])
        alarm ("Выбор контейнера.wav")
        move (H[forcount][1], H[forcount][2])
        wait(100)
        left (H[forcount][1], H[forcount][2])
        wait(300)
        send217 ("Enter")
        wait(100)
       while InWorld (10, 100) ~= 0 do --ждём загрузку
        if InWorld (10, 100) == 0
        then
        break
        else
        end
         wait(200)
      end
       --count[forcount] = 1 --присвоили
        break
      else
      end
  end
  else
  end
    else
    end

  while 1 == 1 do --Выполнять до тех пор пока не будут полны/не произойдёт сбоя
    hint ("Проверяю")
    wait (200)
    hint ("Проверка сбоя")
    if  PS(11, 124) == 16579836
    then
      log ('Сбой')
--Send ("выход")
      wait (500)
      workwindow (h[1][1])
      send217 ("5")
      wait (500)
      send217 ("5")
      wait (5000)
      send217 ("5")
      alarm ("выхожу.wav")
      count[forcount] = 1  -- записываем что он заполнен/бракованный
      --Выхожу из тех окон
      ---------------------------Выключение окон --------------------
      for i=1, #window_name do
        local W = findwindow(window_name[i])
        log('Имя окна: ' .. window_name[i])
        if W then
          log('Найдено окон: ' .. tostring(#W))
          for j=1, #W do
            if ActivW(317, 81) == 0 then --окно активно
              send217 ("5")
              wait(200)
            else
              Wcount[j] = 1  -- записываем если неактивно
              hint ("Окно неактивно")
            end
          end
        else
          log('Найдено окон: 0')
        end  
      end
      --паузу 15 мин--
      log ("Делаю паузу 15 мин")
      wait (150000)
      if t < os.clock() then
      break
    else
    end
    wait (20)
      ---------------------------Включаем ОКНА ОБРАТНО--------------------
      for ii=1, #window_name do
        local WX = findwindow(window_name[ii])
        log('Имя окна: ' .. window_name[ii])
        if WX then
          log('Найдено окон: ' .. tostring(#WX))
          for jj=1, #W do
            if ActivW(317, 81) ~= 0 then --окно неактивно
              send217 ("Enter")
              wait (2000)
              --alarm ("Захожу.wav")
            else
              Wcount[jj] = 1  -- записываем если активно
              hint ("Окно ктивно")
            end  --if ActivW(317, 81)
          end
        else
          log('Найдено окон: 0')
        end
      end
------После включения окон ------------
      break
else
      wait (200)
      hint ("Нет сбоя")
   if HC (828, 11) == 7368192
--полон
    then
      hint ("Выхожу")
      workwindow (h[1][1])
      alarm ("выхожу.wav")
      send217 ("5")
      wait (500)
      send217 ("5")
      wait (5000)
      send217 ("5")
      count[forcount] = 1  -- запиcываем что Бак на этом шаге счетчика полон
      break    
    else
    end -- не полон!... (цикл продолжается)
  end
  end
else
break
end
end
--вышли из цикла времени


if h then
hint ("Окно существует")
workwindow (h [1][1])
if (D (58, 575) == 0  and D1 (408, 572) == 1250075) then
  while (D (58, 575) == 0  and D (408, 572) == 1250075) do
    alarm ("сигнал.wav")
    wait (1000)
    alarm (".wav")
    hint ("Сбой")
    wait (1000)
  end
else
  if count == 1 then
    while count == 1 do
      alarm ("сигнал.wav")
      wait (1000)
      hint ('Баки полны')
      wait (1000)
    end
  else
    if t < os.clock() then
      while t < os.clock() do
        wait (1000)
        hint ("Время истекло")
        wait (1000)
        alarm ("Время истекло.wav")
      end
    else
    end
  end
end
else
while h < 1 do
        alarm ("Окно не существует.wav")
        wait (1000)
        hint ("Окно не существует")
        wait (1000)
      end
end

Автор: cirus 5.7.2020, 11:36

Он же пишет в какой строке ошибка.

Цитата
if WL (441, 561) == 3026224
and WL2 (134, 580) == 1054234
the


Автор: Levo222 5.7.2020, 11:49

Цитата(cirus @ 5.7.2020, 15:36) *

Он же пишет в какой строке ошибка.

Криво скопировано, там будет then

Код
 if h then

Вот этого окна он у меня не находит впринципе, пишет nil

Хотя теперь не появляется ошибка о нехватке enda, видимо при копировании что-то из "лишних" строк снёс, зато теперь h не находит - уже прогресс)

Автор: cirus 5.7.2020, 12:00

Цитата
Вот этого окна он у меня не находит впринципе, пишет nil

Значит нет окна с таким именем.

Автор: Levo222 5.7.2020, 12:01

Цитата(cirus @ 5.7.2020, 16:00) *

Значит нет окна с таким именем.

Я всякие имена вводил. И без имени писал, и просто условие if 1==1 then,
он также в этой строке nil пишет

Автор: cirus 5.7.2020, 12:03

Цитата
он также в этой строке nil пишет

В какой этой?

Автор: Levo222 5.7.2020, 12:08

Цитата(cirus @ 5.7.2020, 16:03) *

В какой этой?

Немного разница есть в ошибках: Когда пишет nil
56: attempt to compare number with nil где её проверяют,
а когда окна вообще нету он на этапе присвоения на h nil пишет
47: attempt to index local 'h' (a nil value)

Даже когда задаешь условие не связанное с h в этой строке такая ошибка
56: attempt to compare number with nil

Автор: cirus 5.7.2020, 12:19

Цитата
local h = findwindow("W0")

Если окно не найдено, то h будет nil. Поэтому workwindow (h [1][1]) вернёт ошибку, потому что массива h не существует.
Если окно будет найдено, то h будет таблицей. Поэтому if h > 0 then вернёт ошибку, потому что таблицу нельзя сравнивать с 0.
Код
--lua
local h = findwindow("Pilot")

if h then   -- если окно найдено
    -- нужные действия
    workwindow (h [1][1])
    log('Окно найдено')
else
    log('Окно не найдено')
end

Автор: Levo222 5.7.2020, 12:29

Цитата(cirus @ 5.7.2020, 16:19) *

Если окно не найдено, то h будет nil. Поэтому workwindow (h [1][1]) вернёт ошибку, потому что массива h не существует.
Если окно будет найдено, то h будет таблицей. Поэтому if h > 0 then вернёт ошибку, потому что таблицу нельзя сравнивать с 0.
Код
--lua
local h = findwindow("Pilot")

if h then   -- если окно найдено
    -- нужные действия
    workwindow (h [1][1])
    log('Окно найдено')
else
    log('Окно не найдено')
end


Я убрал >, всёравно выдает nil

Цитата(Levo222 @ 5.7.2020, 6:13) *

Код
   local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then

Что означает в данном случае if W then ?
Если окно существует? Но ведь это может означать и = 0, и > 0, и > 10, Это ведь не точная команда?

А это разве не сравнение с 0? Ведь по сути if W then это if W ~=0 И почему тут ошибку не возвращает?

Автор: cirus 5.7.2020, 12:35

Цитата
всёравно выдает nil

Естественно. Над этим подумайте:
Код
--lua
do
    local h = 123   -- переменная h существует только в этом блоке
end

-- тут переменной h не существует
log (h)

Автор: Levo222 5.7.2020, 12:48

Цитата(cirus @ 5.7.2020, 16:35) *

Естественно. Над этим подумайте:
Код
--lua
do
    local h = 123   -- переменная h существует только в этом блоке
end

-- тут переменной h не существует
log (h)


ППц, а я думаю почему не видит...


Цитата

local h = 123 -- переменная h существует только в этом блоке

А в чём разница сравнения переменной присвоенной окну с nil и с 0?
просто с 0 ошибку выдаёт
А всё понял, это логический тип.


Но это полбеды. Оказывается основная проблема была в записи log ("Такого типа"),
при удалении которой всё заработало.

Автор: cirus 5.7.2020, 12:53

Цитата
А какеи еще значения нельзя сравнивать с 0?

Никакие, только числа сравниваются с 0.

Автор: Levo222 5.7.2020, 13:44

Область видимости переменных

Теперь у меня на
alarm ("выхожу.wav")
count[forcount] = 1 -- записываем что он заполнен/бракованный
выдаёт nil table

Сама

Исходный код
for forcount=1, 3 do
log (count[forcount])
if count [forcount] == 0 then
log (H[forcount][1], H[forcount][2])
log (count[forcount])
alarm ("Выбор контейнера.wav")
move (H[forcount][1], H[forcount][2])
wait(100)
left (H[forcount][1], H[forcount][2])
wait(300)
send217 ("Enter")
wait(100)
while InWorld (10, 100) ~= 0 do --ждём загрузку
if InWorld (10, 100) == 0
then
break
else
end
wait(200)
end
--count[forcount] = 1 --присвоили
break
else
end
end

Находится выше, но вроде бы в том же блоке while.
А попытка присвоить count значение в другом цикле ниже выдаёт ошибку
Какие еще блоки ограничивают видимость переменной?

Я так понимаю проверку переменой счётчика можно вкладывать только в область цикла его проверки?
--
Правило 1.18

Автор: cirus 5.7.2020, 13:54

Цитата
Какие еще блоки ограничивают видимость переменной?

Все.
Код
--lua
log 'clear' log 'mode compact'

local h = 123           -- переменная видна в любом месте скрипта

if true then            -- условие1
    local h = 456       -- переменная видна до end, который закрывает условие1
    if true then        -- условие2
        local h = 789   -- переменная видна до end, который закрывает условие2
        log (h)     -- 789
    end                 -- end условие2
    log (h)         -- 456
end                     -- end условие1

log (h)             -- 123

Автор: Levo222 5.7.2020, 13:56

Как сделать Блок участка

Цитата(Levo222 @ 5.7.2020, 17:44) *

Исходный код
for forcount=1, 3 do
log (count[forcount])
if count [forcount] == 0 then
log (H[forcount][1], H[forcount][2])
log (count[forcount])
alarm ("Выбор контейнера.wav")
move (H[forcount][1], H[forcount][2])
wait(100)
left (H[forcount][1], H[forcount][2])
wait(300)
send217 ("Enter")
wait(100)
while InWorld (10, 100) ~= 0 do --ждём загрузку
if InWorld (10, 100) == 0
then
break
else
end
wait(200)
end
--count[forcount] = 1 --присвоили
break
else
end
end


Глобальным?
--
Правило 1.18

Автор: cirus 5.7.2020, 13:57

Цитата
Как сделать Блок участка
Глобальным?

Объявить переменные вначале скрипта.

Автор: Levo222 5.7.2020, 14:27

Цитата(cirus @ 5.7.2020, 17:57) *

Объявить переменные вначале скрипта.

Дак по ходу скрипта то они будут меняться, как их сделать видимыми за циклом for?

Исходный код

local count = {0, 0, 0}
for forcount=1, 3 do
log (count[forcount])
if count [forcount] == 0 then
log (H[forcount][1], H[forcount][2])
log (count[forcount])
left (H[forcount][1], H[forcount][2])
wait(300)
send217 ("Enter")
wait(100)
count[forcount] = 1 --присвоили
break
else
end
end
count[forcount] -- тут не видна?
if count == 1 then
while count == 1 do
wait (1000)
--счетчик полон
end
else
end

Как сделать её тут видимой после изменения внутри for?

--
Правило 1.18

Автор: cirus 5.7.2020, 14:34

Цитата
Дак по ходу скрипта то они будут меняться

И что? Будет другое значение, вот и все.
Цитата
count[forcount] -- тут не видна?

Не видна переменная forcount, а массив count виден, т. к. объявлен до цикла.
Код
--lua
local count = {0, 0, 0}

log 'clear' log 'mode compact'

log (count [1])
log (count [2])
log (count [3])

for forcount=1, 3 do
    count [forcount] = 1
end

log (count [1])
log (count [2])
log (count [3])

Автор: Levo222 5.7.2020, 15:11

Цитата(cirus @ 5.7.2020, 18:34) *

И что? Будет другое значение, вот и все.

Не видна переменная forcount, а массив count виден, т. к. объявлен до цикла.

Так, мне надо узнать когда все 3 будут заполнены. А вот тут:
Код
local count = {0, 0, 0}

for forcount=1, 3 do
      log (count[forcount])
       if  count [forcount] == 0 then
        --log ('Есть свободные')
        log (H[forcount][1], H[forcount][2])
        log (count[forcount])
        move (H[forcount][1], H[forcount][2])
        wait(100)
        left (H[forcount][1], H[forcount][2])
        wait(100)
        count[forcount] = 1 --присвоили 1 конкретному шагу, а как узнать #текущего шага?
--что-то делаем с ним
else --текущий использовался
       end
end

Вот что я хочу - узнать полностью ли прошёл цикл for и сколько шагов он проделал
т.е. на каком участке local count = {0, 0, 0} он находится
Чтобы понять 1 это 2-й или 3-й?
Т.е. чтобы в конце проверить
Код
if count == 1 then
    while count == 1 do
      wait (1000)
      hint ('Заполнено')
      wait (1000)
    end
  else
  end

Если полные то что-то делать, если нет то заново запускать. Но так чтобы уже не внутри цикла for forcount это проверять
--
Правило 1.8

Автор: cirus 5.7.2020, 15:24

Цитата
Так, мне надо узнать когда все 3 будут заполнены.

Добавить переменную, в которую записывать сколько раз выполнилось условие.
Код
--lua
log 'clear' log 'mode compact'

local count = {0, 0, 0}
log(table.concat(count, ' '))

local counter = 0
while true do
    for forcount=1, 3 do
        if 1 == 1 then
            count [forcount] = 1
            counter = counter + 1
        end
    end
    if counter == 3 then break end
end

log(counter)
log(table.concat(count, ' '))

Автор: Levo222 5.7.2020, 15:27

Цитата(cirus @ 5.7.2020, 19:24) *

Добавить переменную, в которую записывать сколько раз выполнилось условие.


Хах, но мне то надо за циклом проверять, а за ним эта переменная тоже не будет видна. Как я её присвою если для этого мне надо будет выйти за пределы цикла for forcount, а если я выйду то он начнётся заново?

Цитата(Levo222 @ 5.7.2020, 19:11) *

Т.е. чтобы в конце проверить
Код
if count == 1 then
    while count == 1 do
      wait (1000)
      hint ('Заполнено')
      wait (1000)
    end
  else
  end

Если полные то что-то делать, если нет то заново запускать. Но так чтобы уже не внутри цикла for forcount это проверять

--
Правило 1.8

Можно было написать [..codebox..] [../codebox..] и не тыкать тут правилами. Я откуда знаю как он пишется этот кодебокс.

Автор: Fors1k 5.7.2020, 19:48

Re Levo222
Цитата(Levo222 @ 5.7.2020, 15:27) *
Можно было написать [..codebox..] [../codebox..] и не тыкать тут правилами. Я откуда знаю как он пишется этот кодебокс.
Благодарю за совет о том, что мне можно было написать.
Модератор правилами не "тыкает", а напоминает про них, и следит за их соблюдением.
Что, и как пишется описано https://forum.uokit.com/index.php?showtopic=70302, а также приведена иная важная информация.

Автор: Madeus 5.7.2020, 21:11

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

Код

--lua
log 'clear' log 'mode compact'
local count = 0
log('Count до цикла = ' .. count)
while count < 2 do
  local new_count = 0
  count = count + 1
  log('Count в цикле ' .. count)
  log('New_count в цикле ' .. new_count)
end
log('Count за циклом ' .. count)
log('New_count за циклом ' .. new_count)


Автор: cirus 5.7.2020, 21:16

Цитата
log('New_count за циклом ' .. new_count)

Конкатенация nil приведёт к ошибке, надо так:
Код
log('New_count за циклом ' .. tostring(new_count))

Автор: Madeus 5.7.2020, 21:37

Так и задумывалось, увидеть ошибку и понять почему smile.gif

Автор: Fors1k 5.7.2020, 22:10

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

Код
--lua
a = 5             -- переменная глобальна
do
    local b = 22  -- переменная локальна относительно всего скрипта
    c = 57        -- переменная глобальна
end
log(a);log(b);log(c)

Способ запутаться:
Код
--lua
local a = 5       -- переменная локальна относительно...чего? всего на свете?
do
    local b = 22  -- переменная локальна относительно всего скрипта
    c = 57        -- переменная глобальна
end
log(a);log(b);log(c)

Читаем код:
В глобальной области объявили локальную переменную. Уже интересно, так как эти слова - антонимы.
b сделали локальной, тут понятно.
с сделали глобальной. a вроде тоже глобальная, но объявляли мы ее локальной. Получается a и c в разных областях видимости? Все, пользователь в тупике))

Автор: cirus 5.7.2020, 22:53

Не будет путаницы если давать переменным осмысленные имена.

Автор: Levo222 6.7.2020, 23:10

Цитата(Fors1k @ 5.7.2020, 23:48) *

Благодарю за совет о том, что мне можно было написать.
Модератор правилами не "тыкает", а напоминает про них, и следит за их соблюдением.
Что, и как пишется описано https://forum.uokit.com/index.php?showtopic=70302, а также приведена иная важная информация.

Легко теорезировать и бросаться терминами имея академическое образование, или 10 -летний опыт за спиной, когда в вас преподаватели на протяжении 5-ти-10 лет эти знания впинывают. А потом сидеть тут и умничать. Зайди на юридический форум, я тебе там такими терминами заверну про пространственно временные коллизии и их видимость в правовых полях, и дилекную правоспособность акцептената с оферентом, и примеров накидаю кучу, чтобы ты в них потонул к @ерам собачьим - убежишь оттуда в ужасе с больной головой, и скажешь - "Мне же только вот это надо было...". А я скажу: "Не Е@ет, иди учи теорию!" Я сомневаюсь что такой как ты готов к отдаче. Так что лучше не суй нос туда, где ты еще "пороху" не нюхал. Сегодня применил власть ты - завтра применят в отношении тебя.
-----------------------------------------
Дали потсону модерку поиграться.

Людям нужен эффект, а не ваше умничание на тему контенций, правовых полейполей видимости, акцептенатов и референтов.

Автор: Fors1k 7.7.2020, 1:42

Цитата(Levo222 @ 6.7.2020, 23:10) *
я тебе там такими терминами заверну про акцептената

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

Цитата(Levo222 @ 6.7.2020, 23:10)

Цитата(Levo222 @ 6.7.2020, 23:10) *
Легко теорезировать и бросаться терминами имея академическое образование, или 10 -летний опыт за спиной, когда в вас преподаватели на протяжении 5-ти-10 лет эти знания впинывают. А потом сидеть тут и умничать. Зайди на юридический форум, я тебе там такими терминами заверну про пространственно временные коллизии и их видимость в правовых полях, и дилекную правоспособность акцептената с оферентом, и примеров накидаю кучу, чтобы ты в них потонул к @ерам собачьим - убежишь оттуда в ужасе с больной головой, и скажешь - "Мне же только вот это надо было...". А я скажу: "Не Е@ет, иди учи теорию!" Я сомневаюсь что такой как ты готов к отдаче. Так что лучше не суй нос туда, где ты еще "пороху" не нюхал. Сегодня применил власть ты - завтра применят в отношении тебя.
-----------------------------------------
Дали потсону модерку поиграться.

Людям нужен эффект, а не ваше умничание на тему контенций, правовых полейполей видимости, акцептенатов и референтов.
В целом, ваш пассаж задуматься, конечно, заставляет.
[+]


Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)