Перейти к контенту
Malandrinus

Язык Lua. Общие вопросы программирования

Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

@Solomon753

В Lua нет стандартных способов работы с дисплеем. Разве что через os.execute, но это для тех, кто хорошо знаком с CMD.
А так - необходимо подключать сторонние библиотеки.
 
Lua однопоточен. Поэтому ни о каком "параллельном вычислении" в coroutine нее может быть и речи.
Принцип сoroutine заключается в возможности выполнения определённого блока программы (перевод основного потока программы на этот участок кода), которая при некоторых условиях может приостанавливаться, передавая управление обратно основному потоку, с дальнейшей возможностью  возобновить выполнение потока с момента его предыдущей остановки. Кроме того - основной поток может обрабатывать возвращаемые из сoroutine данные, и в любой момент возобновлять выполнение сoroutine, передавая в него новые данные, которые могут влиять(изменять) порядок работы функции, являющейся телом сoroutine. Это очень мощный инструмент, но увы, как я уже говорил, однопоточный.
Изменено пользователем Nazgool
Ссылка на комментарий

Жаль что нет параллельных потоков, при работе с мышью есть проблемы, если слишком часто опрашивать состояние кнопки, а именно каждые 100мс, то на 7-8 опросе состояние не всегда определяется правильно, а дальше так вообще перестаёт, тоже самое и с операцией MoveMouseRelative, чем дальше, тем чаще несрабатывание и полный отказ. Думал с помощью опроса состояния в параллельном потоке это попробовать решить, если это не проблемы контроллера мыши конечно. Видимо тут ничего не поделаешь, не продумал грамотно производитель мыши реализацию Lua в их устройствах.

 

Про os.execute почитал, интересный оператор, но если через него использовать стороннюю программу для определения цвета, то слишком большие задержки наверняка получатся, да и умеет ли он возвращать данные от программы в код Lua пока что не понял. Библиотек умеющих работать с пикселями тоже пока что не заметил, даже близких упомянаний про подобное нигде нет. Вообще добавление в язык подобного штатного оператора существенно усилило бы возможности взаимодействия со сторонними приложениями, особенно с полноэкранными играми. В любом случае спасибо за помощь.

 

Я вот третье издание Роберто Иерузалимского на русском языке с трудом нашел, кто-то отсканировал страницы, качество конечно так себе, но читать можно. Там pdf файл был запаролен для редактирования, программкой снял пароль, может у кого будет желание улучшить качество, там бы контрастность увеличить, текст бледный, можно через фотошоп групповой обработкой файлов, только через акробат сперва страницы в jpeg файлы сконвертировать нужно, потом обратно в pdf запихнуть. Конечно перевести всё это в текстовый формат вряд ли у кого найдётся время и желание.  Хорошая книжка, хотелось бы чтобы в хорошем качестве на русском была.

На хостинг залил, думаю многим пригодится http://myfolder.ru/files/42637218

Изменено пользователем Solomon753
  • Полезно 1
Ссылка на комментарий

@Solomon753

Да, это стоящая книга. Тем более что Lua 5.2. описан. Пригодится.

186 Мб !!! Это не дело.

Я его через ABBYY в html перегнал. Будет где-то 1 Мб.

Правда "благодаря качеству" ошибок не мало. Придётся ручками.

Так что, если духа хватит, скоро приведу в нормальный вид.

  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

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

Programming in Lua, 3rd Edition Roberto Ierusalimschy http://myfolder.ru/files/42658339

  • Полезно 1
Ссылка на комментарий

Это хорошо. Спасибо.

Но я уже половину сделал.

И на данный момент с копированием примеров проблема.

Нет, их HTML всё копируется замечательно. Но при сканировании через ABBYY, я поставил основной язык русский (перевод-то русский), поэтому не факт, что, например, символ 'a' в коде может быть английский. Наверняка он был расценен как русская 'a'.

Да подобных казусов не мало. Английская буква 'l' (L) вполне часто становится цифрой '1', буква 'О' - цифрой 0 и т.д.

Вручную правлю потихоньку

 

Позже, может быть, скопирую скрипты из последней ссылки.

А книга всё-таки бесценная. Вроде я в Lua как и не новичок, но... короче чайник всё равно.

 

Kirgudu, Murarius

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

Это придаёт некоторых сил.

Изменено пользователем Nazgool
Добавлено Kirgudu,

Пригодится сто пудов, причём, уверен, многим.

Так что спасибо и тебе за работу и @Solomon753, как раскопавшему сие творение в переводе.

Ссылка на комментарий
Так, друзья, во-первых всех с наступающим Новым Годом.

А во-вторых - я не уверен, что Новогодние праздники будут благотворно собствовать мыслительной деятельности.

Да и проблемы с попаданием по клавишам обеспечены.

Поэтому, приурочивая к Новому Году, выложу черновик.

C API пока не осилил (нет ни малейшего желания за личной ненадобностью).

Всё остальное пока руками не трогать! :)

Как я уже сказал - черновик.

Оформлением, ошибками, перекрестными ссылками и всем прочим займусь ... как только так сразу.

Читать по любому гораздо удобнее чем из pdf. Да и нормальный поиск всегда в помощь.

Хотя и оформление пока никакое, но ничто не мешает каждому под личные нужды изменить шрифт или что-то другое в PiL3.css.


Изменено пользователем Nazgool
  • Спасибо 2
  • Нравится 1
Ссылка на комментарий

Подскажите более органичное решение следующей задачи: у меня есть 10 чисел (от 1 до 10 например), мне нужно рандомно получить 5 из них, причем так, что-бы ни одно не повторилось. Мне ничего изящнее в голову не пришло:

local t,i,r = {},1,math.random
while i<6 do
local r = r(10)
if not t[r] then t[r] = true; i=i+1 end
end
@Dennis_Chikin, лишние телодвижения с созданием индексированного массива чисел для выбора мне не нужны. Конкретно есть диапазон, и конкретно-же мне нужно выбрать из него n-ое количество неповторяющихся чисел. И у тебя код неверно будет работать:

 

local t = { ... } --// допустим тут 1 ... 10
local n = #t --// тут 10
local tt = {]
local r
for i = 1,5 do
if n < 1 then break end
r = math.random( n ) --// вот тут и есть ошибка, можем выбрать повторяющееся значение, ты удаляешь значение, а рандом идет по индексу, можешь сам проверить 
tt[i] = t[r]
table.remove( t, r )
n = n - 1
end
Так что твой вариант точно не катит. Изменено пользователем Struck
Ссылка на комментарий

local t = { ... }

local n = #t

local tt = {}

local r

for i = 1,5 do

if n < 1 then break end

r = math.random( n )

tt = t[r]

table.remove( t, r )

n = n - 1

end

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Кхм, ну и в общем виде моя функция будет выглядеть как-то вот так. Если есть варианты лучше - предлагайте, только проверяйте на всякий случай их перед отправкой  ;)

 

get_numbers = function(...)
local t,i,r,c,m,n,list = {},0,math.random,...
while i<c do
local r = tonumber(n) and r(m,n) or r(m)
if not t[r] then t[r] = true; i=i+1 end
end
if list then local tt = {} for k,_ in next,t do table.insert(tt,k) end return tt 
else  return t
end
end
Изменено пользователем Kirgudu
Ссылка на комментарий

После table.remove( t, r ) ни каких "дырок" быть не должно. Это не t[r] = nil.

 

В общем, и во втором случае - это из серии "ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"

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

Ссылка на комментарий

@Dennis_Chikin, переиндексирование и так есть, очевидно же. table.remove удаляет значение со сдвигом, значение может удалится по середине, а индекс по-любому с конца.

"ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"

Порой я твой сарказм не понимаю.

 

"Дырок" там конечно же нет, это тоже очевидно. Вот тебе нагляднейший пример:

 

 

t={}
for i=1,10 do
table.insert(t,i)
end
print("ONE:")
for k,v in pairs(t) do
print(k.."="..v)
end
table.remove(t,t[6])
print("TWO:")
for k,v in pairs(t) do
print(k.."="..v)
end
На выходе:

 

 

ONE:
1=1
2=2
3=3
4=4
5=5
6=6
7=7
8=8
9=9
10=10
TWO:
1=1
2=2
3=3
4=4
5=5
6=7
7=8
8=9
9=10

 

 

Переиндексация идет, а значит твой код косячит именно там где я и указал выше, сейчас лишь только доказал это эмпирически ;)

Изменено пользователем Struck
Ссылка на комментарий

На чужой код не смотрел, сначала написал свой велосипед. 

local data = {1,2,3,4,5,6,7,8,9,10}
math.randomseed(os.time())

function get_numbers(tbl, cnt)
    local result = {}
    for i = 1, #tbl do
        result[i] = tbl[i]
    end
    local to_remove = #tbl - cnt
    while to_remove > 0 do
        to_remove = to_remove - 1
        table.remove(result, math.random(#result))
    end
    return result
end

print(table.concat(get_numbers(data, 4), ", "))
print(table.concat(data, ", "))

У @Dennis_Chikin изменение входных данных есть, это не очень хорошо, по моему мнению. Если и это не критично, то мой код вообще можно упростить до безобразия.

@Struck, код с сокращениями нереально читать, если нету комментариев. Более того, ты через неделю уже не узнаешь сам, что тут написано. Всегда лучше называть переменные своими именами, это очень полезно, а прилюдной обфускацией не стОит заниматься.

PS: рандомной выборки из диапазона у меня нет, но без труда можно прикрутить.

  • Согласен 1

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

а значит твой код косячит именно там где я и указал выше

Тебе шашечки, или ехать ?

Берем значение по индексу, и перекладываем. Всю запись удаляем. Если еще раз выпадает тот же индекс, там будет уже другое значение, которое опять же перекладывается. Что еще надо ?

 

Не меняя качество рэндома, можно сделать только так, и ни как иначе. (Варианты только - делать непосредственно в теле кода, или отдельной функцией, как у Desertir.)

 

Если надо, чтобы исходная таблица сохранялась тоже - либо копируем всю таблицу, либо - заводим еще одну, в формате slected[v] = true, и повторный рандом, если попали на помеченное.

 

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

 

 

P.S. А "сарказм" на самом деле относится к тому, что t = nil в сталкеровской реализации LUA таблицу просто гарантированно разрушает.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий
Ого, сколько тут всего произошло.
Читать все коды тоже не буду. Предложу свой вариант.
Все условия задачи не читал, но ...
Каждый поиск случайного числа можно производить в любой момент, т.е. не обязательно все пять вызовов в одном каком-то потоке. Сделал по принципу перестроения таблицы.
math.randomseed(os.time())
local t = {1,2,3,4,5,6,7,8,9,10}
t_used = 0

function get_my_rnd(tab)
    if t_used == 5 then return end
    t_used = t_used + 1
    local a = math.random(t_used, #tab)
    table.insert(t,1,table.remove(tab,a))
end

get_my_rnd(t)
get_my_rnd(t)
get_my_rnd(t)
get_my_rnd(t)
get_my_rnd(t)

Для повторного использования просто сбросить t_used  в ноль.

В общем тут количество вариантов напрямую зависит от способа использования.

Изменено пользователем Nazgool
  • Спасибо 1
Ссылка на комментарий

@Nazgool, именно то, что я хотел сделать, но не сообразил как, спасибо. Только в функции t на tab надобно поменять.

@Dennis_Chikin, извини, тупанул.

Ссылка на комментарий
Только в функции t на tab надобно поменять

Таки да. На лету делал. Исправил.

Начал приводить в порядок черновик.

Оформляю, исправляю. Это ещё более утомительно, но дело идёт.

Изменено пользователем Nazgool
Ссылка на комментарий

Давеча написал вариант с перестроением таблицы.

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

но с другой стороны само использование функций несёт накладные расходы.

От них можно отказаться в пользу увеличения производительности кода.

Как то так :

math.randomseed(os.time())
local t = {1,2,3,4,5,6,7,8,9,10}
t_used = 0

function get_my_rnd(tab)
    t_used = (t_used == 5 and 0 or t_used) + 1
    local index = math.random(t_used, #tab)
    local value = tab[index]
    tab[t_used], tab[index] = value, tab[t_used]
    return value
end

get_my_rnd(t)
...
  • Полезно 2
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...