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

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

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

С чего начинать и где взять.

 

Установка 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

Изменено пользователем Kirgudu
Ссылка на комментарий

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

 

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, форум АМК съел моё старое имя и не хочет отдавать о_О

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

Ссылка на комментарий

В первой строке по сути ты проверяешь, есть ли в таблице поле с индексом nil? Такого поля естественно нет. Т.е. такая проверка не ошибочна. А вот во второй строке ты пытаешься ключу nil, которого не может в таблице, присвоить какое то значение.

  • Нравится 1
Ссылка на комментарий

Я вот с такой странностью столкнулся (правда не в сталкере, а в интерпретаторе луа версии 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?

 

 

Изменено пользователем cj ayho
Ссылка на комментарий

cj ayho,

по-моему ты загнался :) Код корректно работает и с положительными и с отрицательными числами


Подарки

  • Ссылка на комментарий

    abramcumner

    Багодарю вас тащь капитан. А прибавление 0,5 к первому аргументу вас не смущает?

    Изменено пользователем ColR_iT
    Ссылка на комментарий

    cj ayho,

    вместе с math.floor ни сколько не смущает. Возможно тебе нужно не математическое округление, а какое-то свое - тут хз.

    Но для обычного математического именно так и надо.

    Хинт: -1 > -2

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

    Подарки

  • Ссылка на комментарий

    abramcumner

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

    Изменено пользователем ColR_iT
    Ссылка на комментарий

    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 ))

    Всё работает и вычисляет как положено.

    Наверное не туда смотрю. Не томи, если там что-то и есть, то ткни носом.

    Изменено пользователем Gun12
    Ссылка на комментарий

    Потелепаю чуток...

    Он думает, что раз для положительных "+ 0.5", то для отрицательных "- 0.5" :rofl2:


    Подарки

  • Ссылка на комментарий

    cj ayho,

    код для округления, но работающий только с положительными числами:

    Если бы math.floor работал как "оставить целую часть", то действительно бы не работало для отрицательных чисел. Но эта функция приводит к меньшему целому, т.е. всегда работает на уменьшение независимо от знака. Таким образом, метода с добавлением 0.5 работает корректно для всего диапазона чисел.

     

    Добавлено через 149 мин.:

    Lua почти ничего не добавляет к стандартным функциям СИ, а по части математики набор стандартных СИ-шных функций мягко говоря непоследователен. Вот, к примеру, отсутствие человеческой функции округления. Я СИ занялся не сразу, а после паскаля, фортрана, бейсика и т.п. Довольно скоро потребовалось выполнить округление. Во всех нормальных языках либо число с плавающей запятой само округляется при приведении, либо есть человеческая функция с названием типа round. Но не в СИ. Ну вот тоже сидел тогда и тупил, а как это сделать =)

     

    Плагины Total Commander для работы с игровыми архивами:

    Архиваторный плагин (для работы с одиночным архивом): link1 link2

    Системный плагин (для распаковки установленной игры): link1 link2

     

    Ссылка на комментарий

    malandrinus

    Замечательная наводка насчёт самостоятельного округления при приведении.

    Можно ведь просто :

    function math_round(num, accuracy)
        return tonumber(string.format('%0.'..accuracy..'f',num))
    end

    Наверняка это медленнее, но как вариант.

     

    Да-а-а, проверил. Гораздо медленнее. Не годится.

    Изменено пользователем Gun12
    Ссылка на комментарий

    Gun12,

    уже было вроде в этой теме, что если хочешь гарантированно n цифр после запятой при выводе, то только string.format и прочие.

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

    Так что дело совсем не в скорости.


    Подарки

  • Ссылка на комментарий

    А кстати, хороший вопрос, а зачем вообще нужно "округление с оставлением N знаков после запятой" ? Если для вывода, типа выведутся только имеющиеся знаки, то, как совершенно верно заметил abramcumner, это не прокатит. Округляем мы в десятичной системе, в двоичной число может оказаться периодическим и при выводе мы получим совсем не то, что хотели. Для этого конечно нужно использовать format. А зачем может потребоваться округлить не до конца именно с целью получить новое значение? Мы в итоге получаем некое нецелое число, которому сложно найти практическое применение. Так что лучше сделать функцию попроще, которая безо всяких степеней и умножений будет округлять к целому.

     

    Плагины Total Commander для работы с игровыми архивами:

    Архиваторный плагин (для работы с одиночным архивом): link1 link2

    Системный плагин (для распаковки установленной игры): link1 link2

     

    Ссылка на комментарий

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

    Изменено пользователем Gun12
    Ссылка на комментарий

    Ну я думаю не стОит объяснять как происходит алгоритм округления. Например если округляем до сотых и в тысячных получается 5 и более, то к сотым при округлении добавляется единица. Так вот, использованный мною алгоритм (кнутовский кстати) с положительными числами работает как нужно, но следуя логике алгоритма он не должен работать с отрицательными числами. Хотя при реализации в луа работает. Вот я и спросил - почему.

     

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

    Изменено пользователем cj ayho
    Ссылка на комментарий

    malandrinus, хм вот оно как. я просто оказывается при имплементации не ту ф-цию применил. Спасибо за информацию.

    Ссылка на комментарий

    День добрый.

    В общем есть строка "new_scr" и строка "func_1" (или полностью "new_scr.func_1", переделать первое во второе не проблема). Собственно, я не смог найти, как же вызвать функцию new_scr.func_1(), и приходится хранить в таблице не строки, а ссылку на функцию. Как же это сделать?

    ТЧ 1.0004. SAP и Trans mod

    github

    Ссылка на комментарий

    Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

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

    AMK-Team.ru

    ×
    ×
    • Создать...