Все посты %s в %S - AMK Team
Перейти к контенту

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


Malandrinus

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

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

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

 

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

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

 

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

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


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

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

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

 

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

Спасибо :)

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

Изменено пользователем *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*

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


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

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

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

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

 

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

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

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


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

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

 

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

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

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

 

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

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

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


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

Возможно :)

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

 

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

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


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

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

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

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


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

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

 

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

 

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


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

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

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

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


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

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

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

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

 

___

 

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

math.isnan = function(value)

return value ~= value

end

 

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

 

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

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


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

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

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

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

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


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

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

 

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

 

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

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

 

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

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


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

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

 

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*

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


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

malandrinus, Gun12

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

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


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

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

 

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

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

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


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

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

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

 

_________

 

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

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

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


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

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

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

 

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

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

 

 

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


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

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

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

 

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

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

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

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

 

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

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

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


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

RvP

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

 

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

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

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


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

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