Выскакивает ворнинг "Compare string with number"

Страницы: 1
RSS
Выскакивает ворнинг "Compare string with number", А его не должно быть, по идее!
 
Определяю время сервера так:
 
Код
          HHMMSS = getInfoParam("SERVERTIME")

          if string.len(HHMMSS) == 7 then   hcc, mcc, scc = string.match(HHMMSS,"(%d)%p(%d%d)%p(%d%d)")   else  hcc, mcc, scc = string.match(HHMMSS,"(%d%d)%p(%d%d)%p(%d%d)")
          end
          hcc = tonumber(hcc)   if type(hcc) ~= 'number' then  hcc = 0  end
          mcc = tonumber(mcc)   if type(mcc) ~= 'number' then  mcc = 0  end
          scc = tonumber(scc)   if type(scc) ~= 'number' then  scc = 0  end

потом работаю с часами и минутами:
Код
                if type(hcc) == 'number' and type(mcc) == 'number' then
                       if hcc > 10 and mcc < 5 then
                                                       -- какие-то действия
                       end
                end

И на строку "if hcc <= 10 and hcc >= 9 and mcc < 5 then" периодически вылетает вышеупомянутый ворнинг. Почему он выскакивает? Ведь вроде все преобразования в числа и дополнительные проверки произведены!

На работу скрипта не влияет, но неприятно...
 
Код
   ST = getInfoParam("SERVERTIME") -- Время сервера
   if #ST == 7 then ST = "0"..ST end
   
   if ST > "10:00:00" and ST < "14:00:00" then
      ...
   end
Как вариант
 
Так вы код то покажите нормально.
Сравнение которое вы указали где в коде расположено?
Телепаты в отпуске

PS: SERVERTIME в нерабочее время биржи может показывать все что угодно. Для определения времени уж лучше os.date() использовать
 
Константин Рейм, мне нужно, чтобы в числах были отдельно часы и минуты.

BlaZed, первый фрагмент кода находится в main(), второй - в OnQuote() , ворнинг возникает в рабочее время биржи.
 
Цитата
Александр Волфовиц написал:
Константин Рейм, мне нужно, чтобы в числах были отдельно часы и минуты.

BlaZed, первый фрагмент кода находится в main(), второй - в OnQuote() , ворнинг возникает в рабочее время биржи.
А сама аварийная строка "if hcc <= 10 and hcc >= 9 and mcc < 5 then" где находится?
 
BlaZed, os.date() выдаёт время на компьютере с квиком, а нужно именно время брокерского сервера, которое и выдаёт  getInfoParam("SERVERTIME")
 
Игорь М,в OnQuote(). Никаких действий с hcc и mcc , кроме получения времени и преобразования строк в числа, не производится.  
 
Предположение: В строке if type(hcc) == 'number' and type(mcc) == 'number' then значение глобальной hcc ещё number, а дальше при сравнении в строке "if hcc <= 10 and hcc >= 9 and mcc < 5 then" оно уже string.
Попробуйте перед первым if поставить что-то типа local hcc = hcc (или как вам по коду лучше будет)
 
Лучше перед if объявит локальную hcc, а в конце поставить hcc = hcc или что-то типа этого. Тогда для аварийной строки в OnQuote () hcc всегда будет number.
 
Александр Волфовиц, отличный пример, как прострелить себе ногу в многопоточном окружении. Выше верно написали, мейн меняет hcc на строку как раз после проверки типа в колбеке. Обращение к глобальной переменной из разных потоков должно быть атомарным. Я б посоветовал 1) упаковать все три hcc, mcc, scc в луа-таблицу; 2) в мейне строить локально эту таблицу (а еще лучше специальную функцию написать, ее возвращающую) и сохранять в глобальную переменную одним присвоением; 3) в колбеке создавать локальную копию опять-таки одним присвоением и далее работать только с ней.
 
Цитата
Александр Волфовиц написал:
первый фрагмент кода находится в main(), второй - в OnQuote() , ворнинг возникает в рабочее время биржи.

Но зачем??
Положите весь код в OnQuote - и будет счастье.
 
Я бы сказал, что это просто порочная практика жить в глобальном окружении. Не в смысле плохая - иногда можно, но лучше не надо. Иначе в одном месте написал f = 5 и все сломалось.
 
Цитата
swerg написал:
Положите весь код в OnQuote - и будет счастье.
На малоликвидных инструментах OnQuote может и по 10 секунд не срабатывать - а время желательно чтоб было актуальное.

Вроде бы проблема решилась с помощью локальных переменных перед проверкой, спасибо всем за советы!
 
Зачем вам актуальное время вне OnQuote, если время вы используете в OnQuote ?
 
swerg, время используется не только в  OnQuote. В OnQuote просто всплыл вышеупомянутый ворнинг.
 
Цитата
Александр Волфовиц написал:
 На малоликвидных инструментах OnQuote может и по 10 секунд не срабатывать - а время желательно чтоб было актуальное.
Вроде бы проблема решилась с помощью локальных переменных перед проверкой, спасибо всем за советы!
Я, когда вам отвечал, торопился и поэтому что-то невнятное написал. Хорошо, что есть Антон, который все верно порекомендовал. В вашей ситуации проблема не только со строками/числами, но и со временем. Если вы хотите получать актуальное время, то делайте, как Антон написал, чтобы не было последовательных присвоений, а только разом. Очень маловероятна, но реальна ситуация, что в момент присвоения local hour, min, sec = hcc, mcc, scc вы получите час из старого определения времени в main, а минуту из нового. Подзавис основной поток в начале часа и у вас в OnQuote смещение на 59 минут.
 
Цитата
Александр Волфовиц написал:
время используется не только в  OnQuote. В OnQuote просто всплыл вышеупомянутый ворнинг.

Значит сделайте функцию, которая будет возвращать вам нужные 3 значения - и вызывайте ее везде, где требуется.
Иначе добра не будет.
На один прикол вы уже напоролись, еще один вам описал Игорь М.
 
Маленький совет со временем: переходите на unix-time.

Если Вам надо сравнивать времена, то определите строковые представления в конфигурации и переведите их в числа при старте алгоритма, чтобы не делать это постоянно. Тогда уже сравнивать время будет проще, т.к. это будут просто числа. Ну и прибавлять, убавлять время намного проще, т.к. все в секундах.
 
Код
local Time = X
function OnCallback()  -- любой колбек
  Time = nil
end

function main()
  if Time and os.time() > Time then
    ...
  end
end

Существует ли вероятность того, что значение Time сбросится сразу же после проверки его существования в main и os.time() > Time вернет ошибку?
 
Цитата
Незнайка написал:
Существует ли вероятность того, что значение Time сбросится сразу же после проверки его существования в main
Проверил: вероятность существует.
 
Цитата
Незнайка написал:
Код
   local  Time  =  X
 function   OnCallback ()   -- любой колбек 
  Time  =   nil 
 end 

 function   main ()
   if  Time  and   os.time ()  >  Time  then 
     .. .
   end 
 end   

Существует ли вероятность того, что значение Time сбросится сразу же после проверки его существования в main и os.time() > Time вернет ошибку?
если ядро одно,то не сбросится. Если больше одного, то вероятность =1.
 
Цитата
nikolz написал:
если ядро одно,то не сбросится.
Зачем смуту сеете в «неокрепшие» умы  :smile: ?
---
 Даже если ядро одно, то все равно может сброситься. Потоки и при одном ядре переключаются по времени из-за выделения им квантов процессорного времени. Переключение на выполнение потока колбека может случиться сразу после проверки в main: os.time ()  >  Time. И тогда Time может сброситься при выполнении колбека.
Страницы: 1
Читают тему (гостей: 1)
Наверх