Dennis_Chikin 3 658 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка 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 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Artos 99 Опубликовано 19 Сентября 2012 Поделиться Опубликовано 19 Сентября 2012 Не кажется ли Вам моветоном засорять топик частностями, которые касаются устаревшего и удаленного функционала из актуальной версии Lua?! Если уж очень хочется - есть топики-ковырялки... именно по игре и ее версиям, тут же - язык Lua и общие вопросы для него. [x] (пост для удаления) "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Malandrinus 615 Опубликовано 20 Сентября 2012 Автор Поделиться Опубликовано 20 Сентября 2012 Artos, мне не кажется. Топик про Lua, а значит про все его аспекты: частные и общие, устаревшие, текущие и будущие. Кроме того, нестандартные аспекты языка, присутствующие в игре, также вписываются в этот топик, поскольку в конце-концов мы на форуме модостроителей. И вообще, не надо забывать, что существует такая штука, как смежные темы, имеющие отношение сразу к нескольким областям. Задача куратора - не гонять ссаными тряпками людей, задающих вопросы по смежным темам, а спокойно направлять в нужную тему в том случае, если "смежность" переходит в "совсем не в тему". Как подразумеваемый куратор этого топика я пока никакого криминала не видел. 3 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Struck 61 Опубликовано 20 Сентября 2012 Поделиться Опубликовано 20 Сентября 2012 (изменено) Artos, но ведь в сталкере(ТЧ по крайней мере) и есть тот самый устаревший функционал(касаемо устаревших полей в table есть foreach, foreachi и setn..да и getn я бы уже приписал), так что почему бы и не поковырять эти методы, и не дойти самому до ответа на вопрос "почему их вырезали". По сути не стоит вопрос узнать "почему их вырезали" (к слову они и не вырезаны, во всяком случае lua 5.1 прекрасно оперирует этими функция). А так походу всё и правда начинается попахивать флудом. Кидая в тему лишь догадки - ничего хорошего в итоге не получается. Считаю, что Shredder, да и не только он, решили для себя использовать или нет "устаревший" функционал языка. Для меня тема исчерпана. Пока что... ColR_iT Изменено 20 Сентября 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 20 Сентября 2012 Поделиться Опубликовано 20 Сентября 2012 (изменено) malandrinus, 'моветон' и 'криминал' - несколько различаются по смыслу, как в прочем и вопросы по луа и по игре или системе. Когда обсуждение перекинулось уже на поминание числа ядер и версий игры - посчитал возможным высказать свое мнение о неуместности засорять топик. Жаль, что мое мнение не совпало с мнением 'подразумеваемого куратора'. Собственно мой пост можно и удалить, как не совпадающее с тематикой и о чем и написано в ремарке. Artos,мне не кажется. ... Задача куратора - не гонять ссаными тряпками людей, задающих вопросы по смежным темам, а спокойно направлять в нужную тему в том случае, если "смежность" переходит в "совсем не в тему". malandrinus, мой пост относился не к Вам лично, а к участникам, зашедшим в своем обсуждении слишком далеко за рамки тематики данного топика (ИМХО). Поэтому непонятно для чего пояснять именно мне или передо мною оправдывать вашу позицию, тем более высказанную достаточно грязными словами, неподходящими для подразумеваемого куратора...Если же это не оправдание Вашей позиции, а намек на ... то попросил бы дать разъяснение и/или уточнить адресата. (можно в ЛС). По следам былого (смежного): #18 Время показало, что правота была 'по обоим пунктам' на моей стороне. Файл lua_help.script - является просто напросто куском лог-файла со строками выведенными движком (дебаговыми бинарниками) по консольной команде 'lua_help'. Содержимое выводимых строк зависит от версии дебаговых бинарников, т.е. актуально на момент их компиляции, и содержит не весь перечень классов/свойств/методов/..., а что заложено программистом. Т.о. это все же и не скрипт и устаревшая информация, в контексте ее неполноты и не полной актуальности на момент компиляции релизных бинарников с которыми мы на практике имеем дело. (касается всех версий игры) Изменено 20 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Malandrinus 615 Опубликовано 21 Сентября 2012 Автор Поделиться Опубликовано 21 Сентября 2012 Artos, Мои слова не были оправданием ни в каком смысле, а были именно разъяснением моей позиции. Для определённости. Именно моей, очевидно, что это не моё дело - лезть с советами к другим кураторам. В этом смысле я конечно высказался совершенно зря. По поводу языка. Матом я не ругался и правил не нарушал, а быть образцом во всех отношениях - не моя забота. По поводу lua_help. Разумеется это не скрипт, с этим я не спорил. Два пункта были "неполная" и "устаревшая". Там же я уточнял, что полная лишь в том смысле, что всё перечислено. И почему же устаревшая? Отладочный предрелизный билд в скриптовой части практически ничем не отличается от релиза. Пара отличий имеется, но настолько неважных, что ими можно пренебречь. 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 24 Сентября 2012 Поделиться Опубликовано 24 Сентября 2012 А подскажите кто-нибудь менее монстрообразную конструкцию для замены: v1, v2, v3, v4 = s:match"(%-?[%-%d%.]*)[%s%,]*(%-?[%-%d%.]*)[%s%,]*(%-?[%-%d%.]*)[%s%,]*([%d%.]*)" И, кстати, я, похоже, что-то не понимаю с поведением конструкций вида string.gfind( s, "[%w]*] ) и string.gfind( s, "[%w]+] ) Как оно должно работать ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Malandrinus 615 Опубликовано 24 Сентября 2012 Автор Поделиться Опубликовано 24 Сентября 2012 Dennis_Chikin, Чтобы ответить на первый вопрос нужно знать, что именно ты хочешь этим искать. Что касается второго вопроса string.gfind( s, "[%w]*] ) и string.gfind( s, "[%w]+] ) Как оно должно работать ? для начала, функция string.gfind (или string.gmatch в новых редакциях Lua) возвращает итератор. Это значит, что пользоваться надо так: s = "строка в которой ищем" for s1 in string.gmatch(s, "шаблон") do -- что-то делаем с очередным вхождением end Что же касается смысла приведённых шаблонов. Первое, заключать %w в квадратные скобки здесь смысла нет. %w - это уже символьный класс "цифры и символы алфавита". Квадратные скобки - это формирование другого символьного класса, который в данном случае только и состоит из %w. Второе. Символ "*" (звёздочка) означает "предыдущий символ в количестве от нуля и больше". В данном случае это будет означать "непрерывная комбинация из цифр и букв длиной от нуля и больше". Момент "длиной от нуля" делает этот шаблон в таком варианте весьма бессмысленным. Поясню на примере. В строке "_1___ab12_" этим шаблоном будут найдены такие вхождения: '', '1', '', '','','ab12', '', ''. Т.е. находятся также пустые строки нулевой длины, очевидно промежутки между символами. Проблема здесь в том, что здесь этот шаблон стоит сам по себе. Обычно его используют в комбинации с другими. Последний же вариант "%w+" вполне осмысленный. Означает "любая непрерывная последовательность цифр и букв произвольной длины". Вот такой код: s = "_1___ab12_" for s1 in string.gmatch(s, "%w+") do print(s1) end выдаст такие найденные значения: '1', 'ab12'. Т.е. это удобный способ выделять идентификаторы из списков. К примеру, если я имею список имён, разделённых неважно чем - запятыми, точками с запятыми, пробелами, вертикальной чертой и т.п., то я могу их так выделить. Возможно, потребуется включить в символьный класс недостающие символы, допустимые в идентификаторах. К примеру: s = "a_1, ab12 , qqq_123" for s1 in string.gmatch(s, "[%w_]+") do print(s1) end выделит из строки идентификаторы: 'a_1', 'ab12', 'qqq_123' 2 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 24 Сентября 2012 Поделиться Опубликовано 24 Сентября 2012 По первому вопросу я хочу 4 числа без мусора из строки типа " -195.01,-5.12, 146.45, 50чего-то там ". Все другие варианты, которые смог придумать, дают странное. Чисел всегда 4 (ну или вообще 2), и именно по этой причине с итератором городить огород не хочется. По второму вопросу: ну, там union, да. Для случая с просто %w смысла особого нет, но поведение всей конструкции от этого изменяться же не должно по сравнению со, скажем %w_ или %w%s ? Или должно ? Если символ в строке не попал под шаблон, а мы просим 0 или больше - будет ведь все равно пустая строка ? А если не менее одного - nil ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
ColR_iT 171 Опубликовано 24 Сентября 2012 Поделиться Опубликовано 24 Сентября 2012 (изменено) Dennis_Chikin, извиняюсь, что не совсем в тему, но по первому вопросу есть и другой способ вернуть из строки - числа. str = " -195.01,-5.12, 146.45, 50" a, b, c, d = loadstring("return "..str)() print (a, b, c, d) --# Результат числа: -195.01 -5.12 145.45 50 Работать будет для строки, которая состоит из чисел разделённые запятыми. Изменено 24 Сентября 2012 пользователем ColR_iT Ссылка на комментарий
Malandrinus 615 Опубликовано 24 Сентября 2012 Автор Поделиться Опубликовано 24 Сентября 2012 Dennis_Chikin, По первому вопросу я хочу 4 числа без мусора из строки типа " -195.01,-5.12, 146.45, 50чего-то там ". Тогда примерно как ты делаешь, так и надо делать. Только пара моментов. Вот кусок шаблона, выделяющий одно число "(%-?[%-%d%.]*)". Для начала, не могу согласиться с "*" в конце. Число же есть по-любому, как может быть число включений 0? Здесь должен быть "+" (как минимум одна цифра). Дальше, зачем включать в символьный класс ещё и знак минуса "%-"? Имелся в виду вариант записи с экспонентой типа 123.45e-6 ? Но символ "e" ведь не включён, так что это не сработает. Вообще же с возможностями Lua точно формат числа не описать. Как минимум не хватает вариативной записи, также нет подвыражений. Здесь бы нормальные регулярные выражения, там можно было бы описать точно. Ну а здесь придётся частично полагаться на добросовестность тех, кто поставляет сюда исходную строку. Для случая с просто %w смысла особого нет, но поведение всей конструкции от этого изменяться же не должно по сравнению со, скажем %w_ или %w%s ? Или должно ? Я говорил о другом. Вот к примеру в таком выражении "%-?[%d%.]+" есть правая часть, которая должна быть обязательна, а знак минуса может быть или не быть. В итоге весь шаблон даёт выражение, которое не может быть пустым. Минус слева есть или нет, но это не делает выражение пустым. Если же написать что-то такое "[%w%s]*", то в этом случае не важно, что там в символьном классе. Знак "*" по-любому делает возможным нахождение пустой строки в произвольном месте. Я кстати не уверен, что Lua это обрабатывает корректно. В любом случае, это же бессмысленный результат. ColR_iT, есть и другой способ вернуть из строки - числа. a, b, c, d = loadstring("return "..str)() Мне кажется, так не стоит делать. Это неочевидное решение, формат принимаемой строки сильно ограничен синтаксисом языка, наконец, расходы на компиляцию могут многократно превысить обработку строки шаблонами. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Artos 99 Опубликовано 24 Сентября 2012 Поделиться Опубликовано 24 Сентября 2012 (изменено) А подскажите кто-нибудь менее монстрообразную конструкцию для замены: ... я хочу 4 числа без мусора из строки типа " -195.01,-5.12, 146.45, 50чего-то там ". Меньшая монстрообразность выходит если не пытаться разбирать строку общего вида и подбирая под нее патерны, а исходить из уже заданных условий. Также - не пытаться все засунуть в одну строку. Условие: Исходная строка содержит ряд только чисел, разделенных сепаратором (запятой) В этой ситуации достаточно просто и надежно(!) получить требуемое и заодно не дать запутаться в ошибках, если таковые присутствуют в строке: local tbl = {} --/ табличка с получаемыми числовами значениями for s1 in string.gmatch(s, ",") do if tonumber(s1) then table.insert( tbl, tonumber(s1) ) else --/ тут прерываем игру абортом или игнорируем... (по вкусу) end end local v1,v2,v3,v4 = unpack(tbl) Конечно это не одна строчка, к чему часто стремятся жертвуя и производительностью и безопасностью, но этот код дает достаточную безопасность, распарсивая исходную строку, и не допуская ошибок непрерывности считывания, и именно числовых значений, и сразу преобразует куски строки в числа, чем все одно при парсинге по монстро-патернам придется заниматься. P.S. Само присутствие сепаратора в строке говорит именно о его приоритетности (разделителя на фрагменты) и зачем же мучаться, пытаясь сплошняком разбирать строку? ;-) malandrinus, знак минус'а, в данном примере строки, как раз важен, т.к. в строке могут задаваться и отрицательные значения (а не экспонентного типа), поэтому и стоИт '%-?' - т.е. "если есть в начале один минус или его нет". И, конечно построенные патерны далеки от ... (я бы их не применял), и даже дальнейшее их усложнение врядли даст рабочий вариант. Малейшее отклонение от заданного формата чисел - и значение может быть считано с искажением(!) которое далее невозможно определить. Изменено 24 Сентября 2012 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 24 Сентября 2012 Поделиться Опубликовано 24 Сентября 2012 Дальше, зачем включать в символьный класс ещё и знак минуса "%-"? Остался от экспериментов. В общем, переписал пока так: (%-?[%d%.]+)%,%s* n раз без хвоста Вроде работает, и даже ошибку в данных отловил, которая раньше, с итератором и пачкой адских преобразований проскакивала. Знак "*" по-любому делает возможным нахождение пустой строки в произвольном месте. Я кстати не уверен, что Lua это обрабатывает корректно. Ага, похоже на то, что итератору крышу сносит. Причем вместо пустых строк начинает выдавать первое вхождение. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Malandrinus 615 Опубликовано 24 Сентября 2012 Автор Поделиться Опубликовано 24 Сентября 2012 (изменено) Artos, В этом шаблоне "(%-?[%-%d%.]*)" два минуса. Один в начале и задаёт знак числа. Тут возражений нет. Но есть и второй минус внутри квадратных скобок. Благодаря этому минусу будет неправильно распознан и такой вариант "1-2-3-4". При этом, экспоненциальная форма всё равно не распознается, поскольку символ "E" в шаблон не включён. Также неправильно распознАется вот такой вариант "1.2.3.4..5". Хотя, если подумать, то можно на это не заморачиваться. Достаточно выделить абы как части между разделителями. Дальнейшую проверку с полной достоверностью выполнит операция tonumber. Надо только не забыть проверить возвращаемое значение на nil и адекватно отреагировать. Вот нашёл свою функцию для разделения строки, разделённой запятыми на части. function split_comma_separated_list(s) local res = {} for v in string.gmatch(s, "[^,]+") do table.insert(res, v) end return res end Дальше можно наваять что-то такое для перевода в числа: function strings2numbers(ts) local tn = {} for i,s in ipairs(ts) do local n = tonumber(s) ASSERT(n, "strings2numbers: cannot convert item '%d:%s' to number", i, v) table.insert(tn, n) end return tn end И пользоваться примерно так: local a, b, c = unpack(strings2numbers(split_comma_separated_list(s))) У меня примерно так и сделано. Много где используется. Изменено 24 Сентября 2012 пользователем malandrinus 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 4 Октября 2012 Поделиться Опубликовано 4 Октября 2012 (изменено) Эх. Крутил я, вертел... Есть совершенно замечательный способ имитации luabind от xStream _G.class = function (cls_name) if type(cls_name)~='string' then return function() end end local cls = {} local cls_mt = {} cls_mt.__call = function(...) local cls_obj = {parent = cls_mt.__index} -- imitate parent class, allows call parent's methods local cls_obj_mt = { __index = cls, __gc = function () if cls_obj.__finalize then cls_obj:__finalize() -- imitate destructor end end } setmetatable(cls_obj, cls_obj_mt) if cls_obj.__init then cls_obj:__init(...) -- imitate constructor end return cls_obj end setmetatable(cls, cls_mt) _G[cls_name] = cls return function(parent_cls) cls_mt.__index = parent_cls end end Но... Работаем ведь с Lua. И есть способ, поддерживающий и концепцию, и способы самого lua. Даже больше. Они являются более многофункциональными. Например вот самая примитивная реализация local SetMetaClass = setmetatable function Class(class) class = class or {} class.__index = class.__index or class return class end function Object(class, object) return SetMetaClass(object or {}, class) end local MetaClass = { __call = Object } function class(class) return SetMetaClass(Class(class), MetaClass) end A = class{xxx=12} oA = A{yyy=56} print(oA.xxx) -- 12 oA = class(oA) print(oA.xxx) -- nil И это только начало. Есть более расширенное представление. Из данного кода можно "выжать" очень много полезных методов. Поэтому если есть соображения по данному решению luabind, то прошу высказаться. Изменено 4 Октября 2012 пользователем Gun12 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 9 Октября 2012 Поделиться Опубликовано 9 Октября 2012 Наткнулся на ситуацию, наводящую на мысли что я чего-то важного не знаю... что надо было знать в этом случае. Или может я сошел с ума Короче, имеем некоторую таблицу. Для этой таблицы вызывается цикл: for k,v in pairs(I_List) do local ControlName = self.StoF(k) if ControlName then local bth = CUIButton() btn:SetAutoDelete(true) btn:SetWindowName(ControlName) --- ! ПОЛУЧИТЬ РАЗМЕР ТЕКСТУРЫ local btn_width = ltx:r_float(k, "inv_grid_width") * 50 local btn_height = ltx:r_float(k, "inv_grid_height") * 50 next_x = next_x + btn_width if next_x > 300 then next_x = 0 valid_x = 0 valid_y = valid_y + 50 if valid_y > 400 then --- error! news_manager.send_tip(db.actor, "Inventory Over!", nil, nil, 3000) end end btn:Init(ControlName, valid_x + base_x, valid_y + base_y, btn_width, btn_height) valid_x = valid_x + btn_width next_x = valid_x self:Register(btn) self.main_frame:AttachChild(btn) end end При этом, непосредственно перед циклом содержимое таблицы выводится в лог: { [KEY: STRING:ammo_12x70_buck] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17664; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:2] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17665; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:3] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17666; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:4] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17667; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:5] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17668; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:6] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17669; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:7] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17670; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:8] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17671; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:9] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17672; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } [KEY: NUMBER:10] = VALUE: TABLE:; Table value: { [KEY: NUMBER:1] = VALUE: NUMBER:17673; [KEY: NUMBER:2] = VALUE: NUMBER:1; [KEY: NUMBER:3] = VALUE: NUMBER:12; } } } Как видим, в таблице есть один элемент, ключ его - строка ammo_12x70_buck, значение - таблица из 10 подтаблиц. Вроде бы все нормально? А вот функция которая вызывается в цикле строкой self.StoF: function ammo_cargo_space:StoF(section) if not section then log("NIL НА ВХОДЕ!!!") return end local c1 = string.gsub(section, ".", "") return string.gsub(c1, "-", "") end И вот она следом за парсингом нормально заполненной таблицы, выдает в лог вопль что у нее nil на входе. Каким образом это возможно если ей передается ключ таблицы? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Artos 99 Опубликовано 9 Октября 2012 Поделиться Опубликовано 9 Октября 2012 (изменено) Zander_driver, Судя по function ammo_cargo_space:StoF(section) - это у тебя метод 'StoF' созданного класса 'ammo_cargo_space'. Соответственно и вызывать его требуется как к метод класса self:StoF(...) <- через двоеточие, а не как фунцию/свойство self.StoF <-через точку. Изменено 9 Октября 2012 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
proger_Dencheek 6 Опубликовано 27 Октября 2012 Поделиться Опубликовано 27 Октября 2012 (изменено) Помогите, нужно написать следующий скрипт: Есть две таблици. Одна наполнена строками, другая пустая. Нужно, чтоб при определенном действии отсылалось рандомно сообщение из таблици, если это действие повторяется, опять отсылается рандомное сообщение, но не тоже самое, другое сообщение. Все использованные строки записываются в пустую таблицу, чтоб если отправились все строки, все началось по новому кругу. Это я реализую так: local aa = { "Строка1", "Строка2", "Строка3", "Строка4", "Строка5",} local bb = {} if bb == nil then local cc = math.random(#aa) den.sms(aa[cc]) bb[#aa] = aa[cc] aa[cc] = nil elseif aa == nil then local cc = math.random(#bb) den.sms(bb[cc]) aa[#bb] = bb[cc] bb[cc] = nil end --Функция "den.sms()" отправляет сообщение Результат - безлоговый вылет :-( Подскажите, как написать этот скрипт. Изменено 27 Октября 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 27 Октября 2012 Поделиться Опубликовано 27 Октября 2012 (изменено) proger_Dencheek, твои варианты никогда не будут работать, т.к. по твоим кодам невозможны ситуации, когда aa == nil иль bb == nil истины, т.к. изначально созданные таблицы всегда существуют. 1. Попробуй заменить свои условия на if next(aa) then ... elseif next(bb) then ... , т.е. проверять 'пустоту' таблиц. 2. Если работаешь с индексированной таблицей, то и используй соответствующие ей методы: table.insert и table.remove, а не методы "по ключам"... в противном случае оператор # или будет "врать" или вообще равен 0. и используй в сообщениях, плз, тэги спойлера, для портянок кодов. Изменено 27 Октября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 27 Октября 2012 Поделиться Опубликовано 27 Октября 2012 (изменено) proger_Dencheek Так не должно вылетать local table_messages = {} function random_message() table_messages = next(table_messages) and table_messages or {"msg_1","msg_2","msg_3","msg_4","msg_5"} local rnd = math.random(#table_messages) den.sms(table_messages[rnd]) table.remove(table_messages,rnd) end Изменено 27 Октября 2012 пользователем Gun12 Ссылка на комментарий
proger_Dencheek 6 Опубликовано 30 Октября 2012 Поделиться Опубликовано 30 Октября 2012 Atros, спасибо за помощь. Но есть одна недоработка. Делаю вот так: local aa = { "строка1", "строка2", "строка3", "строка4", "строка5"} local bb = {} local col, col2 = 1, 1 if next(aa) then local cc = math.random(#aa) den.sms(aa[cc]) table.insert(bb, col, aa[cc]) table.remove(aa, cc) col = col + 1 col2 = 1 elseif next(bb) then local cc = math.random(#bb) den.sms(bb[cc]) table.insert(aa, col2, bb[cc2] table.remove(bb, cc2) col2 = col2 + 1 col = 1 end По первому кругу все работает нормально - рандомно отсылается сообщение, одни и те-же сообщения подряд не отсылаются. Но если сообщения в таблице закончатся, то начинают отсылатся одни и те-же, подряд. Gun12, это конечно не вылетает, но сообщения отправляются целым бардаком. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти