-
Число публикаций
618 -
Регистрация
-
Последнее посещение
-
Дней в топе
1 -
AMKoin
37 [Подарить AMKoin]
Весь контент пользователя Nazgool
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Если короче, то почему не сделаны такие возможности для таблиц? : local t1 = {1,2,3} local t2 = {4,5,6} local t = t1 + t2 -- на выходе суммы - таблица t = t:insert(99):sort() Только потому, что смешаются имена своих методов и функций таблицы 'table'? Напр.у меня есть такая возможность (точнее не 'например', а она у меня действительно есть) Создаю таблицу с методом : local t = {} function t:func() end И вставляю в таблицу значение : t:insert('str') Так вот если вдруг я назову свой метод не function t:func() end , а function t:insert() end, то вызвав t:insert('str') произойдёт обращение к методу insert моей таблицы t, а не к функции insert глобальной таблицы 'table'. Т.е. глобальная функция перекроется моей. Под этим я подразумеваю - "смешаются имена своих методов и функций таблицы 'table'" Теперь получается, что если не называть методы моей таблицы 't' именами - concat, remove, sort и остальных из таблицы _G.table, то вполне спокойно можно пользоваться методами, пример которых указан в самом вернем коде. Обращаться, посредством двоеточия, и к функциям моей таблицы, и к функциям _G.table. И теперь вопрос - "Это единственная причина, почему так изначально не сделано в оригинальной библиотеке lua? Или существуют другие "подводные камни"? И если они есть, то хотелось бы узнать об этом". P.S. Моя реализация этой возможности пока сбоев не даёт, но лучше узнать о предстоящих ошибках (если они, конечно, есть) и заранее принять меры. -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Очень давно интересует вопрос, - "Почему в Lua, в котором назначают метатаблицы и метаметоды (пусть даже посредством debug) практически всем типам данных (конечно кроме типа "userdata", как уходящему корнями в С and Ko) , не делают подобного для таблиц? Только потому, что функции таблицы "table" и собственных методов могут слиться (посредством тех же метатаблиц) в одну структуру? Так ведь debug тут не нужен, да и не так много функций той "table". И даже добавив свои, можно просто не называть методы собственных таблиц (классов) такими же именами. Только и всего. А ведь можем иметь доступ к функциям таблицы "table", как к объектам, включая метаметоды событий. Т.е. можно написать : local t = t1 + t2 Или : local t = t1:insert('str'):sort() вместо : for ... каждого элемента таблицы "t1" делать то...то...и то...пока не сделаешь... И так может повторятся много раз. Другими словами создать макрос (в мета-смысле), выполняющем многие подобные действия. А если добавить к этому разницу в производительности кода (упомянутого последним) написанного новичком, и...(ну скажем) не новичком ))), то (тут не нужно быть провидцем) выгода последнего будет более чем очевидна. P.S. Это не праздный вопрос. Я, для себя, такое сделал . Просто интересно, ПОЧЕМУ так не сделано изначально? Может кто знает? -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Совершенно случайно попалось на глаза ошибочное утверждение из поста 803 %s в Lua обозначает соответствие любому из пяти общепринятых пробельных символов. А именно : \009 или \t - горизонтальная табуляция \010 или \n - перевод строки \011 или \v - вертикальная табуляция \013 или \r - возврат каретки \032 - символ пробела Напр. в таком случае : s = '\n\r\t\v ' -- или s='\009\010\011\013\032' s = s:gsub('%s','') длина строки s будет равно нулю. -
[SoC] Ковыряемся в файлах
Nazgool ответил на тему форума автора Halford в Скрипты / конфиги / движок
Снайпер56 В переменной math_random сохраняется ссылка на функцию math.random В lua доступ к локальным переменным несколько быстрее чем к глобальным. Поэтому при интенсивном использовании глобальной переменной ( а таблица math является глобальной), как правило, ссылку на неё сохраняют в локальной. Но это не значит, что одноразово используемую глобальную переменную нужно сохранять локально. Расходы времени и памяти на это объявление не перекроют затрат на прямое обращение к глобальной переменной. Поэтому не имеет смысла. -
[SoC] Ковыряемся в файлах
Nazgool ответил на тему форума автора Halford в Скрипты / конфиги / движок
Transcend ap-pro.ru/forum/21-3598-442784-16-1367162945 -
А-а-а, мать-перемать, сравнивать нужно было со строкой : if ren == "renderer_r2" then... Теперь наконец-то всё стало на свои места.
-
Stiingray, дык а я тебе про что говорил? В первом случае ты получил значение ren : local ren = con:get_string("r2_gloss_factor") И теперь можешь его с чем-то сравнивать : if ren == 3 then Во втором случае ты получаешь какое-то значение ren : local ren = con:get_string("renderer") И с чем ты его сравниваешь? : if ren == renderer_r2 then ? (теперь внимательно, согласно синтаксису lua) Со значением переменной с именем renderer_r2 Т.е. есть некая область памяти, в которую записано ... НЕЧТО. Как lua найдёт эту область памяти? Нужно иметь координаты этой области. Вот координаты и записываются в имени этой области. Другими словами, если записано : renderer_r2, то lua ищет одноимённую запись в стеке (renderer_r2) которые на самом деле являются координатами области памяти, и обращаясь к этой области "показывает" то, что там "записано". Покажи мне - где у тебя ЕЩЁ (РАНЬШЕ) упоминается буквосочетание renderer_r2! В том коде что ты уже не один раз показываешь - НИГДЕ. А если нигде, то это значит только одно - nil
-
Stiingray, действительно, в проверке : if ren == renderer_r2 then , что такое renderer_r2? Это глобальная переменная с именем renderer_r2? Или это может быть локальная, объявленная в данном модуле (блоке) до её использования? Нет. Ни то, ни другое. Переменной с таким именем нет ни там ни там. Поэтому она равна nil, и ничему другому. Вот поэтому проверка никогда и не пройдёт.
-
Непонятно какой именно, точнее где это должно находиться? Если это скрипт из папки scripts, то можно и через _g. А если какой-то другой... Callisto, уточни - что именно ты хочешь сделать?
-
Callisto, для Сталкера, насколько припоминаю, есть такой ход : getFS():exist(path) path - вроде как полный путь к файлу (папке?). Пусть более знающие сталкера подскажут точнее. Во всяком случае, пока не ответят, можешь попробовать. А если для "нормального" lua нужно будет, то милости прошу.
-
Callisto ,с io или без?
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
По хорошему не нужно переписывать функции. Для кириллицы сделать отдельными, иначе скорость раза в 2 падает. -
Твоя таблица у меня работает нормально. Так что может ты не так что-то исправил, либо опять причуды lua а-ля сталкер. Отправил тебе ЛС. Смотри там. -------- Ага, таки ты всё-таки наисправлял... Пожалуйста.
-
Не нужен там никакой второй аргумент. У меня всё работает. Можешь показать свою таблицу? Или дай несколько чисел, которые не правильно переводятся. Да, ещё найди и замени вот ещё что (там лишнее поле создаётся) : for i = 0, 9 do t100['0'..i] = char(240+i) end
-
Да, действительно я забыл про tonumber. Найди в функции toTable : for m in v:gmatch('%S+') do t2[k[n]] = to10(m) n = n+1 end и замени на : for m in v:gmatch('%S+') do local x = to10(m) t2[k[n]] = tonumber(x) n = n+1 end
-
Нет. Просто вызывай : s = toString(table1) Таблица полностью запишется в строку. Вот эту строку и сохраняй Если будет несколько таблиц, то так и пиши : s = toString(table1,table2,table3,table4) -- и т.д. Все эти таблицы запишутся в одну строку. При загрузке получай из пакета строку и вызывай : tab = toTable(s) - s это полученная строка, tab - таблица с восстановленными таблицами table1, и т.д. Затем пишешь : table1 = tab[1] А если сохранял несколько, то : table1 = tab[1] table2 = tab[2] table3 = tab[3] и т.д. И будут тебе твои таблицы в прежнем виде
-
fCloneTable и fCopyTable можно одной функцией сделать Себе так и сделал. Да и на вид по-проще.
-
Artos, OFF_ender, пробуй :
-
Ну это смотря как кодировать. Если использовать HEX вариант то да, один байт экономиться. Т.е. число 1000 переводиться в 3-х значное hex-число, число 100 в 2-х значное Это значит что числа диапазона 256-4095 кодируются 3-мя символами(байтам), 4096-65535 4-мя байтами и т.д. Я использую кодирования с основанием 100 Поэтому диапазоны такие : 99-9999 кодируются 2-мя байтами), 10000-999999 - 3-мя, 1000000-99999999 4-мя и т.д. Так что, как видишь, для этой системы кодирования всё-равно что 100, что 1000. Кодироваться всё равно будет 2-мя байтами в отличии от HEX Насчёт индексов 1,2,3 или ключей стрингов. Функциям по барабану. Количество строки байтов увеличится на длину строк всех ключей - 3 Ну будет лишний десяток байт. Если не критично, то можешь писать стринги. Artos, мне хорошо известно в какую сторону иду я. Не знаю как для тебя, но для меня упражнения в lua дело очень даже полезное. Так что всем спасибо за предупреждения. Приняли. Подумаем на досуге... как-то... Ты же уже давно знаешь меня, и пора привыкнуть что для меня получить готовый результат не самоцель. Ну возьму я хранилища. Нет. Чего мелочиться. Качать готовые моды паком, удалить на фиг lua с компа и не парить себе мозги. Вот.
-
В моём варианте ключи id_a, id_b, numb записываются только один раз. В сохраняемой строке они занимают всего 16 байт. Вот и весь выигрыш в пакете. Всё остальное это значения каждой из подтаблиц. После загрузки строки подтаблицы примут первоначальный вид, каждая с ключами и естественно со значениями. Так что решай что тебе нужнее - 16 байт или нормальный вид подтаблиц. Дальше. Если ты не обращался ко второй таблице, то и записывать её нет смысла. Передавай в вызове только одну s=toString(table1). ну или какую нужно. 8192 байта размер пакета Если тебе будет жалко 16-ти байт, давай подкину вариант, который экономит ещё порядка 200 (может и больше) байт (т.е. максимальный размер таблицы формата 2х50 не превысит 874 байта). А ещё другими словами - в тот же размер (1074) можно записать таблицы формата 2х62
-
В твоём примере я стрингов не видел. В общем так. Я исхожу из следующих утверждений. 1. Таблицы две. 2. В каждой из этих таблиц находится массив из таблиц 3. Все таблицы из массива имеют одинаковые ключи (id_a, id_b и numb) 4. Каждое значение ключа - число из указанного диапазона. Если так, то, как я уже говорил, для 50-ти полей в каждой из таблиц и максимальных значений каждого поля размер будет 1074 байта
-
OFF_ender Если очень нужно, то именно для твоих таблиц могу дать вариант "на скорую руку". Насколько я понял таблиц будет сохраняться две. Если в каждой будет по 50 полей, то размер сохраняемой строки составит около 1кб +-. Так что если ещё актуально - прошу. Хотя сорри. Что означает <1..65535>? кол-во символов или числа из этого диапазона?
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Если учитывать что у нас подавляющее большинство использует Windows, и подавляющее большинство, из этого большинства, использует кириллицу, то у подавляющего большинства, из последнего большинства, несомненно установлена кодировка ANSI 1251 (cp1251). А если так, то обучать можно и не как-то, а красиво : local _lower = string.lower local _upper = string.upper function string.lower(s) return _lower(s:gsub("([А-Я])",function(c) return string.char(c:byte()+32) end):gsub("Ё", "ё")) end function string.upper(s) return _upper(s:gsub("([а-я])",function(c) return string.char(c:byte()-32) end):gsub("ё", "Ё")) end Сюда можно присоединить и тех немногих, у кого стоит ISO 8859-5 (cp28595) Как раз сейчас ковыряюсь с конвертацией самых ходовых кириллических кодировок. Если сделать, то тогда и для всех остальных можно будет использовать. -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Когда-то давно попалась мне эта статья ещё в оригинале. Решил её исправить. В общем, как видели, начал писать, да духа не хватило. Если соберусь с силами - закончу. Да. И в данном случае нужно писать: table_1['0201'] = nil Так это вроде как эквивалентная запись, разве нет!?ColR_iT Это "обман зрения" Написав : table_1.0201 = nil Идёт обращение к ЧИСЛУ! - 0201 А по синтаксису lua к ключу, являющемуся числом, обращаются : table_1[0201] = nil Так что если мы хотим обратиться как строке, то остаётся только один вариант : table_1['0201'] = nil -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Artos, буду буквоедствовать. Если бы я сказал : "Каждое найденное вхождение такой строки..." Но было сказано именно "шаблона", который, как известно, хоть и является строкой, но есть набором специальных элементов со всеми вытекающими. Кстати, а зачем объявлять локальную sValue='' в строке local sPattern,sValue = "","" ? Она и так локальна для цикла for.
- [ЧН] OGSM CS 1.8 CE Fixes
- [ЧН] HARDWARMOD 3.2
- [ЗП] The Long Road
- [ЧН] New vision of War
- [ЧН] Old Good Stalker Mod - Clear Sky
- [ЗП] Unofficial Patch
- [ЗП] Смерти вопреки
- [ЗП] Контракт на хорошую жизнь
- [ЗП] Shoker Weapon Mod 2.1
- [ЗП] Hardcore pack for SGM 2.2
- [ЗП] Контракт Синдиката
- [ЗП] Клондайк 2.0
- ...и другие моды