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

Язык 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
Ссылка на комментарий

Ни у кого не осталось таймеров xStream & malandrinus и расширенного хранилища? Можно в личку? А пост потрите...

Что-то кончается, что-то начинается...

Ссылка на комментарий
Vano_Santuri ВОТ! все что осталось из таймеров-хранилищ от xStream, все остальные паки/скрипты на хостингах были удалены, в том числе и наработки malandrinus
Ссылка на комментарий

Viнt@rь, спасибо.

 

Если кто знает. Есть ли штатные функции кодирования значений? Нужно закодировать не код, а определенное значение. На подобие методов base64/base48 в php.

 

local text="Мод делали тут"

local text_code=code(text) -- кодированное значение типа "if3o8gl5w3hj5og"

local text_decod =decode("text_code")

 

ну и соответственно text_decod = text. Если такого встроенного алгоритма не имеется. Может кто-то баловался для себя с методами шифрования (простейшие от дураков и школоты) и может поделиться на безвозмездной основе?

Что-то кончается, что-то начинается...

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

Vano_Santuri, штатных "шифровальщиков" в Lua не предусмотрено ...

 

Да и стОит ли заморачиваться, тратить времяя и воззвращаться к временам 5-ти летней давности, когда подобное пытались применить и в АМК-моде и др. ? Всегда найдется "не школьник" и отдаст "школоте" на растерзание любые подобные "закодированные" коды ... Да и почему игроку не давать возможности "поиздеваться" над самим собою, внося не или иные (даже глупые) правки?

 

Ну а если приспичило - смотри потребное в стареньких версиях АМК-мода ... даже в немалом кол-ве нынешних модов остался амк-рудимент от выхолощенной amk.decode©.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Vano_Santuri

Щтатный шифровальщик таки присутствует.

Например :

s = "This is string"
-- Запаковка
a = {string.byte(s,1,#s)}
-- Распаковка
print(string.char(unpack(a)))

Конечно это не панацея, но это, как я у же сказал, это есть в стандартных методах.

Но ничто не мешает написать свой код.

Цитата из PIL

string.dump (function)

Возвращает строку, содержащую двоичное представление данной функции, так, что если после этого вызвать функцию loadstring указав ей в качестве параметра эту строку, то мы получим копию функции. function должна быть Lua функцией без внешних локальных переменных (upvalues).

В этой функции и можно задать свой код шифровки/дешифровки, возвращающий результат. Изменено пользователем Gun12
Ссылка на комментарий

Vano_Santuri

Да какой там алгоритм?

Символы переводятся в их же числовые коды в текущей системе (например если это Windows)), а затем обратно.

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

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

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

Как выделяется память для таблиц?

Подозреваю, что на каждый элемент таблицы, плюс если это хеш-таблица, то ещё и на ключи. Так ли это?

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

ColR_iT, или ты некорректно сформулировал вопрос или ... полез в дебри исходников Lua, а не в общие вопросы программирования на этом языке.

И 'таблицы' по структуре различны, а значит и 'выделение памяти' для них, и 'ключ' - собственно зачастую является элементом таблицы и конечно же и под него расходуются ресурсы/память...

Или переформулируй вопрос или переходи к следующим ... тогда может будет понятна суть первого. :-)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

Например для строки - это равно количество символов в строке плюс один байт.

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

ColR_iT,

как выделяется память под таблицы?

Это зависит от того, какая часть таблицы используется. Если массив (т.е. непрерывные ключи от единицы), то в хипе выделяется память под линейный массив элементов и запоминается его размер. Если набор ключей произвольный, то естественно в том же хипе выделяется память под массив пар ключ-значение и тоже запоминается его размер. Одновременно могут присутствовать обе части.

 

Например для строки - это равно количество символов в строке плюс один байт.

Это не так. Строки в Lua не содержат символа-терминатора, а вместо этого запоминается их длина. Строки даже могут содержать символ с нулевым кодом.

  • Нравится 2
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Не совсем уверен что вопрос по адресу, но может кто нибудь объяснить как правильно производить побитовую арифметику? То есть все эти bit_or\bit_and и прочие. (В сталкере по крайнем мере)

 

Допустим есть функция из сталкера:

 

file_list_open_ex("$game_saves$",bit_or(FS.FS_ListFiles,FS.FS_RootOnly),"*.sav")

 

Второй параметр это флажки:

C++ class FS {
const FS_ClampExt = 4;
const FS_ListFiles = 1;
const FS_ListFolders = 2;
const FS_RootOnly = 8;
...
}

 

И допустим я хочу применить 3 флажка: FS_RootOnly, FS_ListFiles, FS_ClampExt

 

Каким образом я могу это сделать? Как мне их... расчитать, понять как скомбинировать...

 

Вот если что список функций для работы с битами в сталкере: bit_and, bit_not, bit_or, bit_xor

Ну и заодно есть ли аналоги этих функций в чистом луа?

 

Зарание спасибо за любую помощь.

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

*Shoker*, аналогов функций работы с битами в чистом Lua нет, поэтому то и портированы в игру указанные тобою функции.

Собственно названия функций сами подсказывают их функционал: 'or' - ИЛИ , 'and' = И и т.д.

В lua_help или в справочнике можно уточнить необходимые аргументы (тип и кол-во) для использования функций.

Учитывая, что в твоей задумке фигурируют три параметра, а функции принимают только по два или даже один (bit_not), то тебе просто придется использовать промежуточные резутаты, например:

local my_flag = bit_or(FS.FS_ListFiles,FS.FS_RootOnly) --/ => 9 - промежуточный результат
my_flag = bit_or(my_flag,FS_ClampExt) --/ => 13 - конечный

ну и далее по твоему контексту: file_list_open_ex("$game_saves$", my_flag, "*.sav")

 

Можно еще проще, учитывая то, что константы класса FS не изменны - сложить в уме все потребные константы (1+8+4 = 13) и написать:

file_list_open_ex("$game_saves$", 13, "*.sav") ... но это уже не "по-программистски" :crazy:

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

В целом разобрался, спасибо.

Ещё вопрос: есть ли принципиальная разница между использованием tbl[index] и tbl.index, возможно в скорости работы или ещё какие-нибудь нюансы?

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

Совершенно разные записи. В первом случае index - переменная, а во втором это ключ-строка, т.е. константа.

Возможно ты имел ввиду tbl["index"] и tbl.index

Представление в виде a.name считается тождественным представлению a["name"].

Тут на счет скорости я ничего не могу сказать, разве что она очень мала в обоих случаях. Запись в квадратных скобках хороша при составном ключе, а запись через точку - если необходимо передать значение при известном ключе, например как чтение нет пакета АМК вариантом (в данном предложении идет речь о строковых ключах).

  • Нравится 1
  • Не нравится 1

ТЧ 1.0004. SAP и Trans mod

github

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

Desertir,

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

Тебе видно не ведомо до сих пор и лень почитать этот же топик на тему, что ключами таблиц могут быть не только строки, но и функции ...

 

 

ColR_iT, принципиальной разницы нет, как и в скорости. Не забываем, что Lua все одно читает (парсит) построчно код и транслирует его в соответсвии с заложенными в него правилами - в итоге оба варианта идентичны.

Ну а нюансы - они всегда найдутся ... ;-) например, если в качестве index выступает аналогичный из другой таблицы, то при неудачном написании может получаться типа: tbl[tbl2[index2]] и при парсинге такой записи парсер вылетает по ошибке из-за наличия ']]' , что является одним из пары оператора комментирования. Поставив пробел ( tbl[ tbl2[index2] ] ) - "нюанс" исчезает.

Изменено пользователем Artos
  • Не нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
парсер вылетает по ошибке из-за наличия ']]' , что является одним из пары оператора комментирования
Это в Сталкере так? Т.е вылетает? Ведь в обычном lua пока не определён первый оператор "[[" ну или "--[[', то читает правильно. Ну или покажи пример с вылетом.
Ссылка на комментарий

Gun12, да, это именно в контексте со СТАЛКЕРом, и именно нюанс, а не правило.

1. Не забываем, что в СТАЛКЕРЕ сдвоенные квадратные скобки '[[' - не только оператор группового комментирования, а и некий оператор, указыващий на обработку строчного значения: [[misc\script_sound]].."ltx" == "misc\\script_sound.ltx"

2. Не смог сейчас воспроизвести ошибку, но точно помню, что в некая комбинация парных скобок мне попортила кровь и пришлось по всем кодам мода пробежаться и проставить пробелы в стремных местах ... Сейчас смотрел на 1.0006, может это проблема на иной версии патча...

Вполне возможно, что мой нюанс проявился когда комментировал групповым оператором комментирования строки с вложенными табличными указателями индексов ...

Суть в словах: "Ну а нюансы - они всегда найдутся" ;-)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Ну а нюансы - они всегда найдутся ... ;-) например, если в качестве index выступает аналогичный из другой таблицы, то при неудачном написании может получаться типа: tbl[tbl2[index2]] и при парсинге такой записи парсер вылетает по ошибке из-за наличия ']]' , что является одним из пары оператора комментирования. Поставив пробел ( tbl[ tbl2[index2] ] ) - "нюанс" исчезает.

Баг не работает. Или его доработать, или удалить и не пугать людей.

 

1. Не забываем, что в СТАЛКЕРЕ сдвоенные квадратные скобки '[[' - не только оператор группового комментирования, а и некий оператор, указыващий на обработку строчного значения: [[misc\script_sound]].."ltx" == "misc\\script_sound.ltx"

2. Не смог сейчас воспроизвести ошибку, но точно помню, что в некая комбинация парных скобок мне попортила кровь и пришлось по всем кодам мода пробежаться и проставить пробелы в стремных местах ... Сейчас смотрел на 1.0006, может это проблема на иной версии патча...

Вполне возможно, что мой нюанс проявился когда комментировал групповым оператором комментирования строки с вложенными табличными указателями индексов ...

 

1. Это касается всего луа, а не персонально сталкера. Двойные квадратные скобки прежде всего работают как "длинные скобки" разрешающие более свободно форматировать строку, а потом уже используемые для блочного комментирования.

2. На ум приходит только "перехват" закрывающимися парными скобками другого блока из таких же парных скобок:

--[[
 local a = b[c[d]]
]]

который должен быть исправлен на такое:

--[=[
 local a = b[c[d]]
]=]

и так далее:

--[==[
 local d="e"
 --[=[
   local a = b[c[d]]
 ]=]
]==]

  • Нравится 1
Ссылка на комментарий

Artos,

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

И абсолютно не аргументировано выражение "Тебе видно не ведомо до сих пор и лень почитать этот же топик на тему, что ключами таблиц могут быть не только строки, но и функции ..."

Во-первых, я это знаю. Во-вторых, при чем здесь функции вообще? Если ты снова решил "пояснить", что ключом может быть что угодно (кроме nil), умоляю, не стОит.

 

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

По порядку. Вызов tbl["index"] идентичен tbl.index - факт, при чем как в первом так и во втором случае получение значения из таблицы идет по строковому (подразумевается, что тип ключа - string) ключу "index" - тоже факт. А вот tbl[index] им уже не идентичен, потому что index не обязательно строка, а переменная, в качестве которой может быть и строка, и число, и черт знает что что взбредет программисту в голову. Единственный случай, когда вызовы действительно будут идентичны, это при index = "index". А при index = nil вообще будет вылет, по крайней мере в сталкере.

 

А теперь почему "константа" и "составной ключ".

При записи через точку, мы никак не сможем переделать ключ: добавить суффикс\префикс. Как будет tbl.index так и останется, нельзя написать tbl.in..dex. При записи в квадратных скобках можно этот ключ "собрать"\"составить" из строк tbl["in".."dex"] и т.п. Так каждый тип записи используется в разных ситуациях, один пример я уже приводил.

 

PS: про уровни строк не слышал? Для комментирование использовать --[=[комментарий]=] да и все...

 


local tbl = {["index"] = 1, index2 = 2, [3] = 3}
local index = 3
local a = tbl["index"] -- a = 1
local b = tbl["index2"] -- b = 2
local c = tbl.index -- c = 1
local d = tbl.index2 -- d = 2
local e = tbl[index] -- e = 3
print(a,b,c,d,e)

 

На некоторое уже ответили, пока я писал.

  • Нравится 1

ТЧ 1.0004. SAP и Trans mod

github

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

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

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

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

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

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

Войти

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

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

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