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

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


Malandrinus

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

Есть таблица вида:

 tbl = {
        text = ...,
        ...
         }

 

Тоесть не с числовыми индексами, как можно определить, что таблица не пустая, кроме как делать перебор вида for k,v in pairs()

Для таблиц с числовыми индексами есть table.getn, а как с этими быть? Вроде бы getn возвращает 0. (я правда #tbl так проверял, но это эквивалентно вроде)

 

Ну и ещё вопросец, возникла необходимость перебирать с большой скоростью (несколько раз в секунду) довольно большую таблицу (около 200 элементов). Таблица с нечисловыми индексами. Перебор делаю через pairs(), если я переделаю таблицу на числовые индексы и буду делать перебор по for i=1, #tbl do, она будет заметно быстрее перебираться? Или перебор таблицы сам по себе не особо много процессорного времени использует?

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

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

Поделиться этим сообщением


Ссылка на сообщение

> А ты вообще по текстовым индексам-то к таблице обращаешься? а то может они тебе и не нужны.

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

 

> Пустые циклы for i=1, #tbl do быстрее pairs() аж на 30%

Спасибо :)

Надо попробовать. Хотя я щас провёл вот тест на пустом цикле с моими двустами объектами, через profiler_timer(), цикл с pairs() отнимал около 6-7 ... тактов (?) тоесть польза 30% ускорения по мне сомнительна, но заюзать можно вполне.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

xStream

Спасибо за ценную информацию :)

 

_____

 

Кто знает, возможно ли в луа делать таблицы из интервалов? Допустим у меня есть число от 1 до 100 и 10 каких то значений.

Я хочу составить таблицу так, чтобы в зависимости от числа, выбиралось определённое значение. Тоесть если чсло равно от 1 до 10, то берётся значение 1 и так дале...

 

Делать через if не очень хочется.

 

Вот такой код нужно упростить:

 

 local num = math.random(1,100)

if num <= 10 then return -2000 end
if num >  10 and <= 20 then return -1500 end
if num >  20 and <= 30 then return -1000 end
if num >  30 and <= 40 then return  -500 end
if num >  40 and <= 50 then return     0 end
if num >  50 and <= 60 then return   500 end
if num >  60 and <= 70 then return  1000 end
if num >  70 and <= 80 then return  1500 end
if num >  80 and <= 90 then return  2000 end
if num >  90 then return  2500 end

return 0

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

Как я понял, в LUA похожего интервального решения не предусмотрено.

Может помимо if-ов есть ещё какие то варианты.

 

ЗЫ: Случайно ошибся в функции, после and не написал num, но на суть вопроса не влияет.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

 

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

Все функции из этого скрипта я вызываю с проверкой вида if _G[script] and _G[script][funct] then, если я обнилю _G[script] = nil, это будет критично для движка?

Ну и раз так, то обратный вопрос, можно ли прямо во время игры "собрать" свой собственный скрипт через _G?

 

А вообще возможно составить функцию на лету? Тоесть скриптво в формате string сделать функцию и скормить компилятору, чтобы он её превротил в нормальную?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Возможно :)

Надеюсь что оно уже экспортировано в ЧН/ЗП (как я понял твоя библитоека тока для ТЧ годится)

 

А вообще я lUA на сталкере учил, поэтому многих спец. функций его даже не знаю, с load-ами никогда не работал, хотя на lua-help читал что то давно про них, но все эти чанки и прочее, я даже не пойму что это.

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

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

Поделиться этим сообщением


Ссылка на сообщение

А в LUA случаем нету "меток" и возможности переходить между ними?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Да я вообще узнать хотел. Аналоги goto в паскале и прочее. Ковырялся в коде, и вдруг подумал, что в этом месте хорошо бы было "перескачить" кусок кода, чтобы не заморачиваться с условными операторами.

 

Функции и прочее это да, но всё же не совсем то. Ну раз нет, значит нет - ничего страшного :)

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

Читаю топик и давно хотел спросить, xStream ты постоянно ругаешь LUA-вский метод создания классов через luabind, а собственно почему он плох и какие ограничения накладывает, и в чём его отличия от классических классов, которые делают его ущербным?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Ммм, интересно, сейчас глянем.

Только вопрос - как будут сохраняться данные из самодельного pstor-а?

ЗЫ: Понимаю, что писать комментарии в коде на английском это что то вроде стандарта, но всё же их стоило написать на русском :D

 

___

 

-- The following assume type(value) == "number":

math.isnan = function(value)

return value ~= value

end

 

Проверяет что value число? Почему б тогда не использовать обычный type()? Просто вот тут как раз не понял значения функции.

 

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

Интересно будет глянуть на твою реализацию, там тоже будет перевод таблицы в строку как в АМК?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
Viнt@rь, ага, поняла. Нет, у меня нет никаких файлов. Механизм попроще, и как разделять, какое хранилище для какого сейва простым способом (в амк)?

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

 

Не знаю как в АМК, но конкретно у себя я записываю в настоящий сейв (в момент создания) имя txt-файла в котором хранятся текущие данные. Единственный минус - нет системы удаления устаревших txt, и они скапливаются со временем.

 

Про новый pstor всё понял :ny_rolleyes:

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

 

Кстати всегда интересовало чем обусловлено ограничение на размер pstor-а в сталкере. Сами GSC в сохранения даже логику игровых объектов записывают зачем то, что тоже занимает немалый объём, а в скриптовый пстор ничего весомого не записать.

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

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

Поделиться этим сообщением


Ссылка на сообщение

Вот столкнулся с такой странностью, есть функция, в ней есть такие строчки

 

1 -  if not loaded_ltx[l_name] then
2 -        loaded_ltx[l_name] = {}
3 -  end

 

l_name имеет тип string, в связи с моей ошибкой он оказался равен nil, и я получил вылет table index is nil, но игра ругалась не на строчку #1 а на строчку #2, тоесть получается что сперва сработала проверка if not loaded_ltx[nil] then а потом уже игра упала на второй строке при попытке использовать nil как ключ для присвоения значения. Интересно почему игра не упала на строке #1

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

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

Поделиться этим сообщением


Ссылка на сообщение

Как получить текстовое название скрипта, в котором находится функция?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

malandrinus, Gun12

Спасибо, подошёл script_name(), самый удобный способ, и без заморочек.

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

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

Поделиться этим сообщением


Ссылка на сообщение

> Мне интересно, в связи с чем потребовалось узнавать имя модуля? У меня самого такая задача тоже возникала, но настолько редко, что я бы не заморачивался на автоматизацию даже при отсутствии штатных стредств. <

 

У меня для вызова функций есть спец. функция которая принимает имя скрипта, имя функции + параметры.

Мне нужно было в пределах одного скрипта вызвать его функцию по её имени, соответственно я должен указать имя скрипта, и имя функции. Имя функции у меня есть, а имя скрипта я бы мог написать вручную, но вдруг потом кто то скрипт переименует?

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

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

Поделиться этим сообщением


Ссылка на сообщение

Можно ли стандартными средствами Lua, доступными в чистом ЧН, открыть текстовый файл на жёстком диске?

Хочу до принудительного вылета через abort() открывать на компьютере пользователя текстовый файл с логом игры.

 

_________

 

Или хотя бы как скопировать текст в буфер обмена средствами Lua?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Цель в том чтобы средствами Lua выполнить программу на компьютере пользователя, например открыть текстовый файл с логом или запустить на крайний случаи какой нибудь exe.

Вариант с io.open это совсем не то.

 

К сожалению ничего подходящего тоже не нашёл.

Единственная боле\менее вменяемая функция для "общения" с пользователем это os.execute(), которая теоретически может работать с командной строкой системы, но в сталкере при её использовании либо ничего не происходит, либо зависает (видимо в случаи возврата ошибки), хотя os.exit() работает, и область видимо экспортирована в Lua.

 

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

Я с ним честно говоря ни разу не работал. Как в него правильно вводить я не знаю.

Проштудировал гугл и справочник. Пробовал такие варианты:

 

os.execute("launcher.exe") - лаунчер это приложение в папке bin (проверял на сталкере), игра виснет на 2-3 секунды, потом всё ок, но ничего не открывается

os.execute("echo hello") - нашёл на каком то форуме, не зависает но в командную строку ничего не выводит, даже если она открыта. Я так понял из описания что эта execute работает с командной строкой.

os.execute("cmd.exe") + параметры всякие ещё - либо ничего либо чаще всего просто зависала игра.

os.execute("mmmmm") - зависает, видимо из за возврата кода ошибки

 

Единственное что не пробовал пока только полный путь указывать.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

RvP

Игра у меня всегда открыта в оконном режиме. но при использовании execute у меня ни визуально, ни в процессах ничего не происходит. Это просто выглядит как зависание. :(

 

скорей всего оно выполнилось и закрылось

В этом приложении есть интерфейс но он не отобразился. А что ещё там могло выполниться я даже не знаю...

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

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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