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

Язык 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
Ссылка на комментарий

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
Ссылка на комментарий

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
Ссылка на комментарий

День добрый.

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

ТЧ 1.0004. SAP и Trans mod

github

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

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

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

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

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

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

Войти

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

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

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