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

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


*****

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



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


**********

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



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

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

-- тут переменной h не существует
log (h)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 12:48
Сообщение #63


*****

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



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

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

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


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


Цитата

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

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


Но это полбеды. Оказывается основная проблема была в записи log ("Такого типа"),
при удалении которой всё заработало.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 12:53
Сообщение #64


**********

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



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

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


*****

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



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

Теперь у меня на
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


Сообщение отредактировал Fors1k - 5.7.2020, 16:27
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 13:54
Сообщение #66


**********

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



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

Все.
Код
--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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 13:56
Сообщение #67


*****

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



Как сделать Блок участка
Цитата(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


Сообщение отредактировал Fors1k - 5.7.2020, 16:27
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 13:57
Сообщение #68


**********

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



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

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


*****

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



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


Сообщение отредактировал Fors1k - 5.7.2020, 16:26
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 14:34
Сообщение #70


**********

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



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

И что? Будет другое значение, вот и все.
Цитата
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])
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 15:11
Сообщение #71


*****

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



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


Сообщение отредактировал Fors1k - 5.7.2020, 16:25
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.7.2020, 15:24
Сообщение #72


**********

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



Цитата
Так, мне надо узнать когда все 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, ' '))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.7.2020, 15:27
Сообщение #73


*****

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



Цитата(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..] и не тыкать тут правилами. Я откуда знаю как он пишется этот кодебокс.


Сообщение отредактировал Levo222 - 5.7.2020, 18:14
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 5.7.2020, 19:48
Сообщение #74


*****

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



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


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


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8460
Пользователь №: 19.451
Возраст: 32



Чет походу все сводится к непониманию синтаксиса 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)

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


**********

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



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

Конкатенация nil приведёт к ошибке, надо так:
Код
log('New_count за циклом ' .. tostring(new_count))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 5.7.2020, 21:37
Сообщение #77


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8460
Пользователь №: 19.451
Возраст: 32



Так и задумывалось, увидеть ошибку и понять почему (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 5.7.2020, 22:10
Сообщение #78


*****

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



Для того, чтобы не путаться в областях видимости, следует писать 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 в разных областях видимости? Все, пользователь в тупике))


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


**********

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



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


*****

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



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

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

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

Людям нужен эффект, а не ваше умничание на тему контенций, правовых полейполей видимости, акцептенатов и референтов.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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