Dennis_Chikin 3 658 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка 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 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
*Shoker* 322 Опубликовано 2 Февраля 2012 Поделиться Опубликовано 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, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Nazgool 250 Опубликовано 2 Февраля 2012 Поделиться Опубликовано 2 Февраля 2012 В первой строке по сути ты проверяешь, есть ли в таблице поле с индексом nil? Такого поля естественно нет. Т.е. такая проверка не ошибочна. А вот во второй строке ты пытаешься ключу nil, которого не может в таблице, присвоить какое то значение. 1 Ссылка на комментарий
cj ayho 0 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) Я вот с такой странностью столкнулся (правда не в сталкере, а в интерпретаторе луа версии 5.0.3. Вот имеется тупейший код для округления, но работающий только с положительными числами: function math_round( roundIn , roundDig ) -- первый аргумент - число которое надо округлить, второй аргумент - количество символов после запятой. local mul = math.pow( 10, roundDig ) return ( math.floor( ( roundIn * mul ) + 0.5 )/mul ) end Теперь вызываем этот код не только для положительных чисел но и для отрицательных: local digit = 1.23456789 print( math_round( digit, 0 ) ) print( math_round( digit, 1 ) ) print( math_round( digit, 2 ) ) print( math_round( digit, 3 ) ) print( math_round( digit, 4 ) ) print( math_round( digit, 5 ) ) print( math_round( -digit, 0 ) ) print( math_round( -digit, 1 ) ) print( math_round( -digit, 2 ) ) print( math_round( -digit, 3 ) ) print( math_round( -digit, 4 ) ) print( math_round( -digit, 5 ) ) А теперь смотрим вывод и выпадаем в осадок: user@cjayho:~/Desktop$ lua ./22.lua 1 1.2 1.23 1.235 1.2346 1.23457 -1 -1.2 -1.23 -1.235 -1.2346 -1.23457 То есть несмотря на то, что код работает с отрицательными числами некорректно, при выполнении кода получаются корректные результаты. Вот у меня и вопрос - wtf o_O? Изменено 3 Февраля 2012 пользователем cj ayho Ссылка на комментарий
abramcumner 1 159 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 cj ayho, по-моему ты загнался Код корректно работает и с положительными и с отрицательными числами Ссылка на комментарий
cj ayho 0 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) abramcumner Багодарю вас тащь капитан. А прибавление 0,5 к первому аргументу вас не смущает? Изменено 4 Февраля 2012 пользователем ColR_iT Ссылка на комментарий
abramcumner 1 159 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) cj ayho, вместе с math.floor ни сколько не смущает. Возможно тебе нужно не математическое округление, а какое-то свое - тут хз. Но для обычного математического именно так и надо. Хинт: -1 > -2 Изменено 3 Февраля 2012 пользователем abramcumner Ссылка на комментарий
cj ayho 0 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) abramcumner В общем мнение ваше я понял. Теперь же хочу выслушать мнение людей, которые в теме математики и программирования. Изменено 4 Февраля 2012 пользователем ColR_iT Ссылка на комментарий
Nazgool 250 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) cj ayho Я не математик, поэтому интересно - что же там такого подводного скрыто? Вставил перед return-ом print('-----------') print('> mul = ',mul) print('> Num * mul = ',roundIn * mul) print('> Num * mul + 0.5 = ', roundIn * mul + 0.5) print('> math.floor = ',math.floor(roundIn * mul + 0.5 )) Всё работает и вычисляет как положено. Наверное не туда смотрю. Не томи, если там что-то и есть, то ткни носом. Изменено 3 Февраля 2012 пользователем Gun12 Ссылка на комментарий
abramcumner 1 159 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 Потелепаю чуток... Он думает, что раз для положительных "+ 0.5", то для отрицательных "- 0.5" Ссылка на комментарий
Malandrinus 615 Опубликовано 3 Февраля 2012 Автор Поделиться Опубликовано 3 Февраля 2012 cj ayho, код для округления, но работающий только с положительными числами: Если бы math.floor работал как "оставить целую часть", то действительно бы не работало для отрицательных чисел. Но эта функция приводит к меньшему целому, т.е. всегда работает на уменьшение независимо от знака. Таким образом, метода с добавлением 0.5 работает корректно для всего диапазона чисел. Добавлено через 149 мин.: Lua почти ничего не добавляет к стандартным функциям СИ, а по части математики набор стандартных СИ-шных функций мягко говоря непоследователен. Вот, к примеру, отсутствие человеческой функции округления. Я СИ занялся не сразу, а после паскаля, фортрана, бейсика и т.п. Довольно скоро потребовалось выполнить округление. Во всех нормальных языках либо число с плавающей запятой само округляется при приведении, либо есть человеческая функция с названием типа round. Но не в СИ. Ну вот тоже сидел тогда и тупил, а как это сделать =) Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) malandrinus Замечательная наводка насчёт самостоятельного округления при приведении. Можно ведь просто : function math_round(num, accuracy) return tonumber(string.format('%0.'..accuracy..'f',num)) end Наверняка это медленнее, но как вариант. Да-а-а, проверил. Гораздо медленнее. Не годится. Изменено 3 Февраля 2012 пользователем Gun12 Ссылка на комментарий
abramcumner 1 159 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 Gun12, уже было вроде в этой теме, что если хочешь гарантированно n цифр после запятой при выводе, то только string.format и прочие. Если использовать функции типа вышеприведенной и выводить как число, будет работать не всегда. Так что дело совсем не в скорости. Ссылка на комментарий
Malandrinus 615 Опубликовано 3 Февраля 2012 Автор Поделиться Опубликовано 3 Февраля 2012 А кстати, хороший вопрос, а зачем вообще нужно "округление с оставлением N знаков после запятой" ? Если для вывода, типа выведутся только имеющиеся знаки, то, как совершенно верно заметил abramcumner, это не прокатит. Округляем мы в десятичной системе, в двоичной число может оказаться периодическим и при выводе мы получим совсем не то, что хотели. Для этого конечно нужно использовать format. А зачем может потребоваться округлить не до конца именно с целью получить новое значение? Мы в итоге получаем некое нецелое число, которому сложно найти практическое применение. Так что лучше сделать функцию попроще, которая безо всяких степеней и умножений будет округлять к целому. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 3 Февраля 2012 Поделиться Опубликовано 3 Февраля 2012 (изменено) Да вроде как была поставлена задача, которую человеку нужно решить для каких-то целей. Про применение ведь ничего не сказано. Интересно было решить для того чтобы... решить )) Изменено 3 Февраля 2012 пользователем Gun12 Ссылка на комментарий
cj ayho 0 Опубликовано 4 Февраля 2012 Поделиться Опубликовано 4 Февраля 2012 (изменено) Ну я думаю не стОит объяснять как происходит алгоритм округления. Например если округляем до сотых и в тысячных получается 5 и более, то к сотым при округлении добавляется единица. Так вот, использованный мною алгоритм (кнутовский кстати) с положительными числами работает как нужно, но следуя логике алгоритма он не должен работать с отрицательными числами. Хотя при реализации в луа работает. Вот я и спросил - почему. Если я конечно корректно определил что math.floor просто отбрасывает числа после запятой. Изменено 4 Февраля 2012 пользователем cj ayho Ссылка на комментарий
abramcumner 1 159 Опубликовано 4 Февраля 2012 Поделиться Опубликовано 4 Февраля 2012 cj ayho, Так ты уж прочитай наконец-то описание math.floor Ну или ответ malandrinus'а. Ссылка на комментарий
cj ayho 0 Опубликовано 4 Февраля 2012 Поделиться Опубликовано 4 Февраля 2012 malandrinus, хм вот оно как. я просто оказывается при имплементации не ту ф-цию применил. Спасибо за информацию. Ссылка на комментарий
Desertir 202 Опубликовано 6 Февраля 2012 Поделиться Опубликовано 6 Февраля 2012 День добрый. В общем есть строка "new_scr" и строка "func_1" (или полностью "new_scr.func_1", переделать первое во второе не проблема). Собственно, я не смог найти, как же вызвать функцию new_scr.func_1(), и приходится хранить в таблице не строки, а ссылку на функцию. Как же это сделать? ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Real Wolf 34 Опубликовано 6 Февраля 2012 Поделиться Опубликовано 6 Февраля 2012 Desertir, local sFunc = "new_scr.func_1()" local Function = loadstring(sFunc) Function() Вроде так. Если что поправьте. Ссылка на комментарий
RvP 1 Опубликовано 6 Февраля 2012 Поделиться Опубликовано 6 Февраля 2012 Desertir, _G[file][function]()? Vita sine libertate, nihil Vita sine litteris - mors est Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти