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

35 страниц V < 1 2 3 4 > »   
Ответить в эту темуОткрыть новую тему
> Помогите освоить LUA
cirus
сообщение 27.10.2018, 18:31
Сообщение #21


**********

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



Цитата
Я попробовал и даже простейшую функцию не смог сделать в Lua.

Выкладывайте код, поправим.
Для примера:
Код
--lua
-- функция должна находится выше её вызова
function f(x, y)   -- принимает 2 параметра
    return x+y     -- возвращает сумму
end

local z=f(5, 6)    -- вызов функции
log (z)

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.10.2018, 19:53
Сообщение #22


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Не смог реализовать goto как только не пробовал, даёт ошибку.

Такая и у меня работает. Мне нужно передать в неё переменную, там с ней выполняются действия и мне нужна модифицированная ПЕРЕМЕННАЯ. А точнее таблица.

То есть я должен передать в функцию таблицу.

Хотя и с обычной переменной ничего не получилось.

Надо типа такого, чего не работает.

--lua
function proba(a)
return a = 12
end
log "clear"
local zz = 5
local tt = proba(zz)
log(tt)

если без return то в основном теле будет nil
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.10.2018, 19:53
Сообщение #23


**********

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



Цитата
Не смог реализовать goto

Лучше сразу забудьте про него.
Код
--lua
function proba(a)
    a = 12
    return a
end

log "clear"
local zz = 5
local tt = proba(zz)
log(tt)

Код
--lua
log "clear"  log "mode compact"
function f(arr2)
    for i=1, #arr2 do
        arr2[i]=arr2[i]*2     -- умножить все элементы на 2
    end
end

local arr={}
for i=1, 10 do     -- заполнить массив числами от 1 до 10
    arr[i]=i
end

log (table.concat(arr, " "))     -- содержимое массива
f(arr)    -- вызов функции
log (table.concat(arr, " "))     -- содержимое массива после вызова функции
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.10.2018, 20:01
Сообщение #24


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Спасибо. То есть goto не работает??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.10.2018, 20:04
Сообщение #25


**********

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



Цитата
То есть goto не работает??

Нет. Он и не нужен.
В луа его вообще нет. Вроде как есть в луа 5.3.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.10.2018, 20:16
Сообщение #26


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Меня конечно учили в своё время, что goto использовать является минимум признаком дурного стиля, но иногда это сильно упрощает код.

Всё верно, именно Lua 3 я и смотрел.

Буду думать, если не смогу модифицировать скрипт без goto придётся отказаться от Lua.

Да, конечно можно без goto , но придётся городить огород с кучей while-ов код будет ужасно плохо читаемым. У меня goto использовался например для рестарта скрипта в случае отключения интернета, ну и ещё в 2-х критических случаях, придётся всё заключать в циклы и брейками прерывать скрипт.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.10.2018, 2:11
Сообщение #27


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
Да, конечно можно без goto , но придётся городить огород с кучей while-ов код будет ужасно плохо читаемым. У меня goto использовался например для рестарта скрипта в случае отключения интернета, ну и ещё в 2-х критических случаях, придётся всё заключать в циклы и брейками прерывать скрипт.

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

У нас luajit - стабильный релиз которого соответсвует версии 5.1. Это форк с динамической компиляцией, который существенно шустрее в работе. Сейчас он, пожалуй, более распространен, чем оригинальный луа. Можно смело исользовать мануалы от 5.1.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 0:00
Сообщение #28


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



А оператор continue в цикле while есть?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 29.10.2018, 0:18
Сообщение #29


**********

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



В луа нет continue.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 1:28
Сообщение #30


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Это очень нехорошо. Если честно, то я не понимаю. С одной стороны типа прогрессивная вещь, а с другой стороны вроде очевидных вещей нет. Придётся буквально весь код запихивать в функции, которые будут содержать куски кода без особой логики. Видимо придётся их так и называть blok01 .. blok77. А основное тело будет состоять из вызова этих кусков. Просто в моём случае десятки раз вызывается функция обработки ошибок и обработки возникших неадекватных ситуаций. Собственно там и были goto которые перенаправляли код на повторные действия. Так что придётся работать брейками и кусками с ретурнами.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.10.2018, 4:29
Сообщение #31


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Код
while var > 1 do
    local result = check_some_params()
    if result then
        some_actions()
    end
end

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

Он там и должен быть. Весь. Не в функциях у тебя может быть какая-то инициализация (подгрузка параметров из файла настроек, например, или массивов). Кроме этого у меня не в функции вот такая строчка:
main()
Т.е. вызов основной функции. Больше там ничего и не должно быть.
Цитата
Видимо придётся их так и называть blok01 .. blok77

А вот так делать не надо. Уверяю можно найти нормальное решение. (IMG:style_emoticons/default/smile.gif)

Цитата
В луа нет continue.

5.3, но, в классическом 5.1 нет, ну и в luajit релизе тоже нет.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 12:55
Сообщение #32


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Спасибо Дарк. Но у меня так не получится. Допустим у меня проверка в 4-ом колене ветвления if . После проверки происходит дальнейшее выполнение кода в этом же ИФе. То есть проверить и по результатам что-то выполнить - это не требуется, а наоборот в обязательном порядке прекратить выполнение кода (ну глупо что-то выполнять если отключили интернет или сервер недоступен) и в данном примере идти почти в самое начало скрипта и крутить цикл пока не появится связь с сервером. Поэтому выход вижу только один всё пихать в функции. После проверки выполнять return из функции, а вот весь остальной код придётся запихивать в if. И таких ифов до конца всего кода будет ну с десяток точно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 13:15
Сообщение #33


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Слишком сложный код. никакого линейного выполнения кода нет. Всё постоянно меняется, поэтому много проверок всяких. Управление конечно попытался упростить насколько смог. Всё управляется несколькими десятками файлов конфигурации. А файлами конфигурации управляет файл сценария. Хотя и сценарий тоже может изменяться по ходу скрипта. В итоге ну полная иллюзия, что играет живой человек. Игра выполняется хоть круглые сутки и нет повторения событий. Я только контролирую и занимаюсь не ерундой, а пытаюсь ещё и чем-то полезным заниматься.

По логике у тебя тоже всё правильно. Собственно так примерно и будет, только эти вайлы будут как снежный ком. И формат уедет настолько сильно вправо, что код будет плохо читаемым. Буду как-то сочетать. Что-то сделаю локальным распихав по функциям, что-то придётся умещать в одном блоке кода.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 13:25
Сообщение #34


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Грубо говоря есть определённое количество событий, которые могут вызываться один из другого. И простыми вызовами функций я могу получить неконтролируемую рекурсию. Поэтому в Пилотовском коде я и использовал goto. Тут придётся крепко репу почесать, чтобы было красиво и эффективно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 14:41
Сообщение #35


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



local n = "123.txt"
local f = io.open(n, "r")

Не смог открыть файл при помощи переменной. Перепробовал всё что знал - результат нуль. Просветите меня пожалуйста. Что-то мне подсказывает, что намаюсь я ещё. И большая просьба в примерах показывайте работу с переменными, поскольку у меня всё только через переменные.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.10.2018, 14:44
Сообщение #36


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
Не смог открыть файл при помощи переменной

А лежит он где? Рядом с ехе пилота? Пилот перезапускали?

По поводу break можно делать вызов функции через assert и внутри функции потом вызывать ошибку, это приведет к ее завершению.
Тем не менее не забывайте про return. При раскидывании по функциям он зачастую полноценно заменяет break.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 15:04
Сообщение #37


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Обычным текстом открывает [[123.txt]]

Минутку, теперь и обычным не открывает, сейчас гляну.

Доигрался, вообще Пилот завис.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 29.10.2018, 15:09
Сообщение #38


**********

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



Цитата
вообще Пилот завис.

Скорее всего были какие-то ошибки.
Код
--lua
local n = "123.txt"   -- файл лежит рядом с exe пилота
local f = io.open(n, "r")

log "clear" log "mode compact"
if f then   -- если файл открылся
    log(f:read())  -- первая строка из файла
else
    log ("Файл не открылся")
end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 15:17
Сообщение #39


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Перегрузил Пилот через прибивалку, всё заработало, спасибо Дарк.

Видимо крепко я накуралесил, да ещё и игра играет в параллельном скрипте.

И тебе cirus тоже спасибо.


Теперь буду знать, что иногда надо пнуть ногой по баллону.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.10.2018, 15:40
Сообщение #40


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



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

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

 

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