Здравствуйте, гость ( Вход | Регистрация )

5 страниц V < 1 2 3 4 5 >  
Ответить в эту темуОткрыть новую тему
> -Счётчик, -Lua-
Levo222
сообщение 27.6.2020, 4:56
Сообщение #41


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(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

П.С.: Можно как-то изменить дефолт расположения звуков проигрываемым пилотом? А то там такая музыкальная коллекция собралась, что ничего другого не видно уже.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.6.2020, 11:42
Сообщение #42


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

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

Где скрипт, который выдаёт такую ошибку?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 28.6.2020, 5:55
Сообщение #43


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(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 работает не так, как я думаю и переводит скрипт не в те места где я ожидаю.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 28.6.2020, 10:45
Сообщение #44


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

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

Это что?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 28.6.2020, 11:00
Сообщение #45


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



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

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

Это что?

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

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

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

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

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

Было бы чем понимать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 29.6.2020, 7:11
Сообщение #46


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



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

Код

while do

if then
else
end

if then
else
end

end


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

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

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

А разве таким образом нельзя получать состояние переменных в таблице?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 29.6.2020, 11:05
Сообщение #47


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

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

Нет.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 2:13
Сообщение #48


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



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

Что означает в данном случае if W then ?
Если окно существует? Но ведь это может означать и = 0, и > 0, и > 10, Это ведь не точная команда?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 2:24
Сообщение #49


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

Тоже самое что:
Код
if W ~= nil then
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 5.7.2020, 2:27
Сообщение #50


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2398
Пользователь №: 18.746



Цитата(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


Сообщение отредактировал Fors1k - 5.7.2020, 2:28


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 2:37
Сообщение #51


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



У меня постоянно вылазит ошибка
Цитата
"#строки: 'end' expected (to close if at line #строки) near 'log'

Хотя все endы на месте и циклы закрыты. Что ему надо-то? Не пойму.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 2:44
Сообщение #52


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

Если пишет значит есть ошибка. Выкладывайте код или ищите ошибку.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 11:29
Сообщение #53


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 11:36
Сообщение #54


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



Он же пишет в какой строке ошибка.
Цитата
if WL (441, 561) == 3026224
and WL2 (134, 580) == 1054234
the

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 11:49
Сообщение #55


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



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

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

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

Код
 if h then

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

Хотя теперь не появляется ошибка о нехватке enda, видимо при копировании что-то из "лишних" строк снёс, зато теперь h не находит - уже прогресс)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 12:00
Сообщение #56


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

Значит нет окна с таким именем.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 12:01
Сообщение #57


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



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

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

Я всякие имена вводил. И без имени писал, и просто условие if 1==1 then,
он также в этой строке nil пишет
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 12:03
Сообщение #58


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



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

В какой этой?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 12:08
Сообщение #59


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 12:19
Сообщение #60


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26702
Пользователь №: 16.971
Возраст: 29



Цитата
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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

5 страниц V < 1 2 3 4 5 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 19.4.2024, 19:44
Designed by Nickostyle