Разработчики могут прокомментировать ситуацию, потому что если делаем вызов функции без getInfoParam - message(string.gsub('23:22:21',':',''),100), она работает.
Роман пишет: Хэ, прикольно. И что это может быть за ерундой %(
Какая версия терминала у Вас используется? Вы проверяли именно на следующей строке message( string.gsub(getInfoParam('SERVERTIME'),':',''),100) Или в коде есть другие? если естьпопробуйте в скрипте оставить только одну строку, и не запускайте другие скрипты если они есть. Также, следует проверить а тот ли скрипт Вы запускаете, возможно просто перепутали скрипты местами.
И вот ещё tonumber(string.gsub(getInfoParam('SERVERTIME'),':','')) > 100 в промежутке подключения и загрузки таблиц выводит: attempt to compare number with nil, хотя упёрто не видит tonumber()
Роман, те симптомы которые Вы описываете, возникают при отсутствии соединения с сервером. Вы точно уверены что соединение есть? Это можно определить по индикатору в нижнем правом углу окна терминала, в подключенном состоянии он зеленый.
25:10:00 - отражает когда соединение есть, не зависимо от времени соединения, tonumber() выдающий ошибку attempt to compare number with nil - да в основном падает в начале соединения (скорее кажется когда таблицы закачает), здесь ещё не понятно почему tonumber() - nil отдаёт, причём даже ставлю tonumber(Time)~=nil and tonumberi(Time)>0 всеравно выводит attempt to compare number with nil
Роман, В общем то что у Вас происходит не поддается какому-либо объяснению. В виду чего дальнейший анализ не представляется возможным. Присылайте скриншоты, на подобии того что я выложил, чтобы было видно код, терминал, и результат работы этого кода.
У него type(Time) равен string но на tonumber(Time)>0 - attempt to compare number with nil, ну вот какой из tonumber() nil?
вот пример одного из кодов который валится на тайме:
Код
function TTime()
local Time = Stime()
--message('('..tostring(Time)..'
> 95959 and '..tostring(Time)..' < 135955) or ('..
tostring(Time)..' > 140259 and '..tostring(Time)..' < 184400) and
'..tostring(see_td("LOC_DATE"))..' ==
'..tostring(see_td("TRADE_DATE")),100000)
if (Time ~= nil and (Time
> 95959 and Time < 135955) or (Time > 140259 and Time <
184400)) then - attempt to compare number with nil на Time
> 95959
return "T"
end
return "-"
end
function Stime()
local Ftimes = 0
Ftimes = getInfoParam("SERVERTIME") -- ночью показывает 25:12:45
return tonumber(string.sub(Ftimes,0,2)..string.sub(Ftimes,4,5)..string.sub(Ftimes,7,9))
--return tonumber(string.gsub(getInfoParam('SERVERTIME'),':',''))
end
str = "23:23:23"
--[[
if tonumber(str:gsub(':','')) > 100 then -- так не работает - " attempt to compare number with nil "
print('111')
end
--]]
if tonumber((str:gsub(':',''))) > 100 then -- так работает
print('111')
end
Это не заплатки. перечитайте еще раз внимательно документацию по string.gsub и tonumber
string.gsub('23:23:23', ':', '') возвращает два значения: '232323' и 2, которые передаются в tonumber В свою очередь, tonumber пытается перевести '232323' в число по основанию 2 и возвращает nil
Michael Bulychev, а вот это я не заметил: '232323' и 2. Но все равно с.м. вариант функции которую я выше выложил там используется string.sub(Ftimes,0,2)..string.sub(Ftimes,4,5)..string.sub(Ftimes,7,9) и он все равно муть какую-то возвращает, второго параметра там ну не как не откуда взятся.
if tonumber((string.gsub(getInfoParam('SERVERTIME'),':','')) or '0') > 100 then - так более подходяще.
Роман пишет: Michael Bulychev , а вот это я не заметил: '232323' и 2. Но все равно с.м. вариант функции которую я выше выложил там используется string.sub(Ftimes,0,2)..string.sub(Ftimes,4,5)..string.sub(Ftimes,7,9) и он все равно муть какую-то возвращает, второго параметра там ну не как не откуда взятся.
if tonumber((string.gsub(getInfoParam('SERVERTIME'),':','')) or '0') > 100 then - так более подходяще.
Проблема изучается. Постараемся в ближайшее время дать ответ.
Заплатки я в принципе поставил. Но вот эта проблема с влитом в процессе загрузки таблиц до сех пор смущает. Хотя я думал что и tonumber не может выдавать nil - а оказывается может :(
tonumber((string.gsub(getInfoParam('SERVERTIME'),':','')) or '0') все равно равен nil при закачки таблиц tonumber((string.gsub(getInfoParam('SERVERTIME'),':','')) or '0') > 0 attempt to compare number with nil
в общем я поставил так Stime() ~= nil робот продолжает работа.
ну или так, только скобку подправить: return tonumber((string.gsub(getInfoParam('SERVERTIME'),':',''))) or -1
С этим просто какая то ерунда, кода нет соединения или таблицы загружаются, getInfoParam('SERVERTIME') не равняется не nil и не времени :( поэтому даже если поставить проверку getInfoParam('SERVERTIME') ~= nil она про игнорируется, у того же LASTRECORDTIME - постоянно есть запись в ячейки.
Роман пишет: кода нет соединения или таблицы загружаются,
SERVERTIME - это время сервера, если нет соединения с сервером, нельзя узнать время сервера. LASTRECORDTIME - это время последнего изменения, оно просто висит
Sergey Gorokhov да я так и понял :), в мануале не помещало инфу об этом добавить.
И последний вопрос, по дате:
string.gsub(getInfoParam('TRADEDATE'),'.',''). Парни, а кто нибудь знает как в string.gsub точку указать для паттерна? '\.' - такой вариант тоже не берёт.
Ошибка будет исправлена в одной из следующих версий программы
Мне интересно, что тут можно исправить, если время "сбрасывается" при смене торговой даты, которая в свою очередь меняется при перезагрузке сервера? Не вижу никаких проблем в использовании того формата времени, что есть сейчас, наоборот даже удобство: 1) Если время > 23:50 - значит торги уже закончились 2) Если время < 09:30 - значит начался новый торговый день, но торги ещё не начались
Надо делать так, как надо. А как не надо - делать не надо.
Серж пишет: Мне интересно, что тут можно исправить, если время "сбрасывается" при смене торговой даты, которая в свою очередь меняется при перезагрузке сервера?
Тоже столкнулся с этой ошибкой, когда потребовалось конвертировать дату, для сохранения в базу, посыпались ошибки. До времени 23:59:59 всё в порядке, а далее .... вместо 00:00:00 показывает 24:00:00. Далее дождался ещё час и хотел увидеть 01:00:00, а увидел 25:00:00. Дальше ждать не стал... Версия терминала последняя, соединение установлено. Это будние дни, что происходит в выходные ещё не смотрел. Это однозначно ошибка, все пользователи не должны сами отслеживать и ставить заплатки...разберитесь.
DronGO пишет: дождался ещё час и хотел увидеть 01:00:00, а увидел 25:00:00
А что бы Вы хотели увидеть, если дата торгов еще не сменилась? Насколько я понимаю, она меняется только утром. Если бы время начало отсчитываться заново с 0 часов прежде чем сменится дата торгов, то это выглядело бы так, будто мы вернулись в прошлое и начали вчерашний день заново. К каким неожиданным последствиям это может привести - можно только гадать, но очевидно, что это могло бы ввести в заблуждение каких-нибудь роботов и т.д. По-моему, ничего особо страшного во времени, превышающем 24 часа, нет. В данном случае это меньшее из двух зол.