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

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

Не кажется ли Вам моветоном засорять топик частностями, которые касаются устаревшего и удаленного функционала из актуальной версии Lua?!

Если уж очень хочется - есть топики-ковырялки... именно по игре и ее версиям, тут же - язык Lua и общие вопросы для него.

 

[x] (пост для удаления)

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

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

Artos,

мне не кажется. Топик про Lua, а значит про все его аспекты: частные и общие, устаревшие, текущие и будущие. Кроме того, нестандартные аспекты языка, присутствующие в игре, также вписываются в этот топик, поскольку в конце-концов мы на форуме модостроителей. И вообще, не надо забывать, что существует такая штука, как смежные темы, имеющие отношение сразу к нескольким областям. Задача куратора - не гонять ссаными тряпками людей, задающих вопросы по смежным темам, а спокойно направлять в нужную тему в том случае, если "смежность" переходит в "совсем не в тему".

 

Как подразумеваемый куратор этого топика я пока никакого криминала не видел.

  • Нравится 3
 

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

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

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

 

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

Artos, но ведь в сталкере(ТЧ по крайней мере) и есть тот самый устаревший функционал(касаемо устаревших полей в table есть foreach, foreachi и setn..да и getn я бы уже приписал), так что почему бы и не поковырять эти методы, и не дойти самому до ответа на вопрос "почему их вырезали".

 

По сути не стоит вопрос узнать "почему их вырезали" (к слову они и не вырезаны, во всяком случае lua 5.1 прекрасно оперирует этими функция). А так походу всё и правда начинается попахивать флудом. Кидая в тему лишь догадки - ничего хорошего в итоге не получается.

Считаю, что Shredder, да и не только он, решили для себя использовать или нет "устаревший" функционал языка. Для меня тема исчерпана. Пока что...

ColR_iT

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

malandrinus, 'моветон' и 'криминал' - несколько различаются по смыслу, как в прочем и вопросы по луа и по игре или системе. Когда обсуждение перекинулось уже на поминание числа ядер и версий игры - посчитал возможным высказать свое мнение о неуместности засорять топик. Жаль, что мое мнение не совпало с мнением 'подразумеваемого куратора'. Собственно мой пост можно и удалить, как не совпадающее с тематикой и о чем и написано в ремарке.

Artos,

мне не кажется. ... Задача куратора - не гонять ссаными тряпками людей, задающих вопросы по смежным темам, а спокойно направлять в нужную тему в том случае, если "смежность" переходит в "совсем не в тему".

malandrinus, мой пост относился не к Вам лично, а к участникам, зашедшим в своем обсуждении слишком далеко за рамки тематики данного топика (ИМХО). Поэтому непонятно для чего пояснять именно мне или передо мною оправдывать вашу позицию, тем более высказанную достаточно грязными словами, неподходящими для подразумеваемого куратора...

Если же это не оправдание Вашей позиции, а намек на ... то попросил бы дать разъяснение и/или уточнить адресата. (можно в ЛС).

 

 

По следам былого (смежного): #18

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

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

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

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

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

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

Artos,

 

Мои слова не были оправданием ни в каком смысле, а были именно разъяснением моей позиции. Для определённости. Именно моей, очевидно, что это не моё дело - лезть с советами к другим кураторам. В этом смысле я конечно высказался совершенно зря.

 

По поводу языка. Матом я не ругался и правил не нарушал, а быть образцом во всех отношениях - не моя забота.

 

 

По поводу lua_help. Разумеется это не скрипт, с этим я не спорил. Два пункта были "неполная" и "устаревшая". Там же я уточнял, что полная лишь в том смысле, что всё перечислено. И почему же устаревшая? Отладочный предрелизный билд в скриптовой части практически ничем не отличается от релиза. Пара отличий имеется, но настолько неважных, что ими можно пренебречь.

  • Нравится 1
 

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

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

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

 

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

А подскажите кто-нибудь менее монстрообразную конструкцию для замены:

v1, v2, v3, v4 = s:match"(%-?[%-%d%.]*)[%s%,]*(%-?[%-%d%.]*)[%s%,]*(%-?[%-%d%.]*)[%s%,]*([%d%.]*)"

 

И, кстати, я, похоже, что-то не понимаю с поведением конструкций вида

 string.gfind( s, "[%w]*] ) и string.gfind( s, "[%w]+] ) 

Как оно должно работать ?

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

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

 

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

По первому вопросу я хочу 4 числа без мусора из строки типа " -195.01,-5.12, 146.45, 50чего-то там ".

Все другие варианты, которые смог придумать, дают странное.

Чисел всегда 4 (ну или вообще 2), и именно по этой причине с итератором городить огород не хочется.

 

По второму вопросу: ну, там union, да. Для случая с просто %w смысла особого нет, но поведение всей конструкции от этого изменяться же не должно по сравнению со, скажем %w_ или %w%s ? Или должно ?

Если символ в строке не попал под шаблон, а мы просим 0 или больше - будет ведь все равно пустая строка ?

А если не менее одного - nil ?

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

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

Работать будет для строки, которая состоит из чисел разделённые запятыми.

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

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

 

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

А подскажите кто-нибудь менее монстрообразную конструкцию для замены:

...

 

я хочу 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, знак минус'а, в данном примере строки, как раз важен, т.к. в строке могут задаваться и отрицательные значения (а не экспонентного типа), поэтому и стоИт '%-?' - т.е. "если есть в начале один минус или его нет". И, конечно построенные патерны далеки от ... (я бы их не применял), и даже дальнейшее их усложнение врядли даст рабочий вариант. Малейшее отклонение от заданного формата чисел - и значение может быть считано с искажением(!) которое далее невозможно определить.

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

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

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

Дальше, зачем включать в символьный класс ещё и знак минуса "%-"?

Остался от экспериментов. В общем, переписал пока так:

(%-?[%d%.]+)%,%s* n раз без хвоста

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

Знак "*" по-любому делает возможным нахождение пустой строки в произвольном месте. Я кстати не уверен, что Lua это обрабатывает корректно.

Ага, похоже на то, что итератору крышу сносит. Причем вместо пустых строк начинает выдавать первое вхождение.

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

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)))

У меня примерно так и сделано. Много где используется.

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

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

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

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

 

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

Эх. Крутил я, вертел...

Есть совершенно замечательный способ имитации 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, то прошу высказаться.

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

Наткнулся на ситуацию, наводящую на мысли что я чего-то важного не знаю... что надо было знать в этом случае. Или может я сошел с ума :)

Короче, имеем некоторую таблицу. Для этой таблицы вызывается цикл:

    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.

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

Zander_driver,

Судя по function ammo_cargo_space:StoF(section) - это у тебя метод 'StoF' созданного класса 'ammo_cargo_space'.

Соответственно и вызывать его требуется как к метод класса self:StoF(...) <- через двоеточие, а не как фунцию/свойство self.StoF <-через точку.

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

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

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

Помогите, нужно написать следующий скрипт:

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

 

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()" отправляет сообщение

 

Результат - безлоговый вылет :-(

Подскажите, как написать этот скрипт.

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

proger_Dencheek, твои варианты никогда не будут работать, т.к. по твоим кодам невозможны ситуации, когда aa == nil иль bb == nil истины, т.к. изначально созданные таблицы всегда существуют.

1. Попробуй заменить свои условия на if next(aa) then ... elseif next(bb) then ... , т.е. проверять 'пустоту' таблиц.

2. Если работаешь с индексированной таблицей, то и используй соответствующие ей методы: table.insert и table.remove, а не методы "по ключам"... в противном случае оператор # или будет "врать" или вообще равен 0.

 

и используй в сообщениях, плз, тэги спойлера, для портянок кодов.

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

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

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

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

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

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, это конечно не вылетает, но сообщения отправляются целым бардаком.

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

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

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

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

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

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

Войти

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

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

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