*Shoker* 322 Опубликовано 25 Октября 2011 Есть таблица вида: tbl = { text = ..., ... } Тоесть не с числовыми индексами, как можно определить, что таблица не пустая, кроме как делать перебор вида for k,v in pairs() Для таблиц с числовыми индексами есть table.getn, а как с этими быть? Вроде бы getn возвращает 0. (я правда #tbl так проверял, но это эквивалентно вроде) Ну и ещё вопросец, возникла необходимость перебирать с большой скоростью (несколько раз в секунду) довольно большую таблицу (около 200 элементов). Таблица с нечисловыми индексами. Перебор делаю через pairs(), если я переделаю таблицу на числовые индексы и буду делать перебор по for i=1, #tbl do, она будет заметно быстрее перебираться? Или перебор таблицы сам по себе не особо много процессорного времени использует? Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 25 Октября 2011 (изменено) > А ты вообще по текстовым индексам-то к таблице обращаешься? а то может они тебе и не нужны. Ну текстовые индексы я привёл для примера, просто обычно я использую в качестве индекса не порядковый номер в таблице а какое то имя или id-шку объекта. И вот сегодня был момент, когда надо убедится в том, что таблица пустая, в принципе мне это уже не нужно, но знать та хочется > Пустые циклы for i=1, #tbl do быстрее pairs() аж на 30% Спасибо Надо попробовать. Хотя я щас провёл вот тест на пустом цикле с моими двустами объектами, через profiler_timer(), цикл с pairs() отнимал около 6-7 ... тактов (?) тоесть польза 30% ускорения по мне сомнительна, но заюзать можно вполне. Изменено 25 Октября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 6 Ноября 2011 (изменено) 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 Изменено 6 Ноября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 6 Ноября 2011 (изменено) В принципе можно и так, но хорошо бы найти решение не тока для "конкретного" случая, ибо уже пару раз сталкивался с такой необходимостью, и приходилось через if-ы действовать... Как я понял, в LUA похожего интервального решения не предусмотрено. Может помимо if-ов есть ещё какие то варианты. ЗЫ: Случайно ошибся в функции, после and не написал num, но на суть вопроса не влияет. Изменено 6 Ноября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 15 Ноября 2011 (изменено) Знаю что это из ряда фантастики, но штатными методами LUA можно ли "выключить" весь скрипт или функцию? Тоесть допустим у меня скрипт с рядом функций, которые из разных мест вызываются переодически. Могу ли я тупо "остановить" их. Тоесть чтобы если функцию вызовет какой то скрипт, игра не вылетела, но и функция не выполнилась? Насколько я понял, все скрипты при компиляции заносятся в некую таблицу, к которой можно получить доступ из _G. Все функции из этого скрипта я вызываю с проверкой вида if _G[script] and _G[script][funct] then, если я обнилю _G[script] = nil, это будет критично для движка? Ну и раз так, то обратный вопрос, можно ли прямо во время игры "собрать" свой собственный скрипт через _G? А вообще возможно составить функцию на лету? Тоесть скриптво в формате string сделать функцию и скормить компилятору, чтобы он её превротил в нормальную? Изменено 15 Ноября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 15 Ноября 2011 Возможно Надеюсь что оно уже экспортировано в ЧН/ЗП (как я понял твоя библитоека тока для ТЧ годится) А вообще я lUA на сталкере учил, поэтому многих спец. функций его даже не знаю, с load-ами никогда не работал, хотя на lua-help читал что то давно про них, но все эти чанки и прочее, я даже не пойму что это. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 29 Ноября 2011 А в LUA случаем нету "меток" и возможности переходить между ними? Тоесть есть кусок кода, его можно "отметить" и в нужный момент перескочить именно на него. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 29 Ноября 2011 Да я вообще узнать хотел. Аналоги goto в паскале и прочее. Ковырялся в коде, и вдруг подумал, что в этом месте хорошо бы было "перескачить" кусок кода, чтобы не заморачиваться с условными операторами. Функции и прочее это да, но всё же не совсем то. Ну раз нет, значит нет - ничего страшного Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 2 Января 2012 (изменено) Читаю топик и давно хотел спросить, xStream ты постоянно ругаешь LUA-вский метод создания классов через luabind, а собственно почему он плох и какие ограничения накладывает, и в чём его отличия от классических классов, которые делают его ущербным? Изменено 2 Января 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 7 Января 2012 (изменено) Ммм, интересно, сейчас глянем. Только вопрос - как будут сохраняться данные из самодельного pstor-а? ЗЫ: Понимаю, что писать комментарии в коде на английском это что то вроде стандарта, но всё же их стоило написать на русском ___ -- The following assume type(value) == "number": math.isnan = function(value) return value ~= value end Проверяет что value число? Почему б тогда не использовать обычный type()? Просто вот тут как раз не понял значения функции. Изменено 7 Января 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 7 Января 2012 (изменено) Вот на pstor очень интересно посмотреть, особенно на запись таблиц. Сам давно уже пишу всё в текстовый файл но это накладывает определенённые ограничения (плюс я не знаю всех тонкостей функций чтения\записи что вывелось в не очень аккуратный код) Интересно будет глянуть на твою реализацию, там тоже будет перевод таблицы в строку как в АМК? Изменено 7 Января 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 8 Января 2012 Viнt@rь, ага, поняла. Нет, у меня нет никаких файлов. Механизм попроще, и как разделять, какое хранилище для какого сейва простым способом (в амк)? Что касается колбека, то именно на появление актора производится инициализация хранилища, раньше - нет, так как я не могу гарантировать его полную загрузку. Не знаю как в АМК, но конкретно у себя я записываю в настоящий сейв (в момент создания) имя txt-файла в котором хранятся текущие данные. Единственный минус - нет системы удаления устаревших txt, и они скапливаются со временем. Про новый pstor всё понял :ny_rolleyes: Но вот ограничение на размер таблицы и необходимость наличия актёра в онлайне увы снижает (по крайнем мере для меня) его полезность. Кстати всегда интересовало чем обусловлено ограничение на размер pstor-а в сталкере. Сами GSC в сохранения даже логику игровых объектов записывают зачем то, что тоже занимает немалый объём, а в скриптовый пстор ничего весомого не записать. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 2 Февраля 2012 Вот столкнулся с такой странностью, есть функция, в ней есть такие строчки 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* 322 Опубликовано 10 Февраля 2012 (изменено) Как получить текстовое название скрипта, в котором находится функция? Изменено 10 Февраля 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 10 Февраля 2012 malandrinus, Gun12 Спасибо, подошёл script_name(), самый удобный способ, и без заморочек. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 11 Февраля 2012 > Мне интересно, в связи с чем потребовалось узнавать имя модуля? У меня самого такая задача тоже возникала, но настолько редко, что я бы не заморачивался на автоматизацию даже при отсутствии штатных стредств. < У меня для вызова функций есть спец. функция которая принимает имя скрипта, имя функции + параметры. Мне нужно было в пределах одного скрипта вызвать его функцию по её имени, соответственно я должен указать имя скрипта, и имя функции. Имя функции у меня есть, а имя скрипта я бы мог написать вручную, но вдруг потом кто то скрипт переименует? Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 17 Марта 2012 (изменено) Можно ли стандартными средствами Lua, доступными в чистом ЧН, открыть текстовый файл на жёстком диске? Хочу до принудительного вылета через abort() открывать на компьютере пользователя текстовый файл с логом игры. _________ Или хотя бы как скопировать текст в буфер обмена средствами Lua? Изменено 17 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 17 Марта 2012 Цель в том чтобы средствами Lua выполнить программу на компьютере пользователя, например открыть текстовый файл с логом или запустить на крайний случаи какой нибудь exe. Вариант с io.open это совсем не то. К сожалению ничего подходящего тоже не нашёл. Единственная боле\менее вменяемая функция для "общения" с пользователем это os.execute(), которая теоретически может работать с командной строкой системы, но в сталкере при её использовании либо ничего не происходит, либо зависает (видимо в случаи возврата ошибки), хотя os.exit() работает, и область видимо экспортирована в Lua. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 18 Марта 2012 (изменено) Я с ним честно говоря ни разу не работал. Как в него правильно вводить я не знаю. Проштудировал гугл и справочник. Пробовал такие варианты: os.execute("launcher.exe") - лаунчер это приложение в папке bin (проверял на сталкере), игра виснет на 2-3 секунды, потом всё ок, но ничего не открывается os.execute("echo hello") - нашёл на каком то форуме, не зависает но в командную строку ничего не выводит, даже если она открыта. Я так понял из описания что эта execute работает с командной строкой. os.execute("cmd.exe") + параметры всякие ещё - либо ничего либо чаще всего просто зависала игра. os.execute("mmmmm") - зависает, видимо из за возврата кода ошибки Единственное что не пробовал пока только полный путь указывать. Изменено 18 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение
*Shoker* 322 Опубликовано 18 Марта 2012 RvP Игра у меня всегда открыта в оконном режиме. но при использовании execute у меня ни визуально, ни в процессах ничего не происходит. Это просто выглядит как зависание. скорей всего оно выполнилось и закрылось В этом приложении есть интерфейс но он не отобразился. А что ещё там могло выполниться я даже не знаю... Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Поделиться этим сообщением Ссылка на сообщение