Почему неправильно работает "if" в колбэке

Страницы: 1
RSS
Почему неправильно работает "if" в колбэке
 
function OnOrder(order)
  local param = 0
  if order.trans_id == opt.trans_id then
     opt.order_num = order.order_num
     WAIT_answer = false
     if order.balance == 0 then tbl_set.flag = "Off" end
     param = tbl_set.volume_opt - order.balance

message("OnOrder1:\ntbl_set.volume_opt = "..tbl_set.volume_opt.."\ntbl_set.volume_opt_ex = "..tbl_set.volume_opt_ex.."\nparam = "..param.."\n") -- tbl_set.volume_opt = 20; tbl_set.volume_opt_ex = 18; param = 18

     if tbl_set.volume_opt_ex ~= param then      -- несмотря на то, что tbl_set.volume_opt_ex = param = 18 скрипт входит внутрь оператора "if"

message("OnOrder2:\ntbl_set.volume_opt = "..tbl_set.volume_opt.."\ntbl_set.volume_opt_ex = "..tbl_set.volume_opt_ex.."\nparam = "..param.."\n") -- tbl_set.volume_opt = 20; tbl_set.volume_opt_ex = 18; param = 18

        tbl_set.volume_opt_ex = param
        FUT_Ex_flag = true
        SAVE_Settings_flag = true
     end
  elseif order.trans_id == fut.trans_id then
     fut.order_num = order.order_num
     if order.balance == 0 then
        tbl_set.volume_fut_ex = tbl_set.volume_fut_ex + order.qty
        SAVE_Settings_flag = true
     end
  end
end
 
В теле MAIN после OnOrder выполнение кода приводит к вылету.

        message("MAIN:\ntbl_set.volume_opt = "..tbl_set.volume_opt.."\ntbl_set.volume_opt_ex = "..tbl_set.volume_opt_ex.."\n")  -- tbl_set.volume_opt = 20; tbl_set.volume_opt_ex = 18
        if tbl_set.volume_opt > tbl_set.volume_opt_ex then CHANGE_OPT_price = Send_OPT_Transaction() end -- эта строка приводит к ошибке "attempt to compare number with string"

После того, как переменной tbl_set.volume_opt_ex в колбэке присваивается какое-либо значение, начинаются проблемы. Изредка система пишет что в переменной "nil"
 
Добавил везде
message(tbl_set.volume_opt_ex+tbl_set.volume_opt).."\n")
все считается = 38
Однако скрипт вылетает.
 
Цитата
Алексей Ширяев написал:
if tbl_set.volume_opt > tbl_set.volume_opt_ex then CHANGE_OPT_price = Send_OPT_Transaction() end -- эта строка приводит к ошибке "attempt to compare number with string"
В сообщении об ошибке  написано, что Вы пытаетесь сравнить число со строкой
следовательно надо написать так:

if tonumber(tbl_set.volume_opt) > tonumber(tbl_set.volume_opt_ex)  then CHANGE_OPT_price = Send_OPT_Transaction() end
 
а еще лучше написать так:
local x1=tonumber(tbl_set.volume_opt)
local x2=tonumber(tbl_set.volume_opt_ex)
if x1 and x2 and x1>x2   then CHANGE_OPT_price = Send_OPT_Transaction() end
 
Цитата
Николай Камынин написал:
Цитата
Алексей Ширяев   написал:
if tbl_set.volume_opt > tbl_set.volume_opt_ex then CHANGE_OPT_price = Send_OPT_Transaction() end -- эта строка приводит к ошибке " attempt to compare number with string"
В сообщении об ошибке  написано, что Вы пытаетесь сравнить число со строкой
следовательно надо написать так:

if tonumber(tbl_set.volume_opt) > tonumber(tbl_set.volume_opt_ex)  then CHANGE_OPT_price = Send_OPT_Transaction() end
уже пробую, но ведь это числовые переменные, там числа - количества лотов, которые много где контролируются и используются в вычислениях.
 
короче сделал я что-бы изначально при загрузке данных параметров из файла контролировалось присвоение им именно числового параметра с помощью "tonumber". Вроде пока заработало.
Самое интересное, что при расчетах переменные ведут себя как обычные числа, а вот при сравнении - как строки.
 
Цитата
Алексей Ширяев написал:
Самое интересное, что при расчетах переменные ведут себя как обычные числа, а вот при сравнении - как строки.
Сразу видно, что документация по Lua читалась по диагонали. ;)
 
Цитата
Алексей Ширяев написал:
короче сделал я что-бы изначально при загрузке данных параметров из файла контролировалось присвоение им именно числового параметра с помощью "tonumber". Вроде пока заработало.
Самое интересное, что при расчетах переменные ведут себя как обычные числа, а вот при сравнении - как строки.
Поясняю:
Дело в том, что строки тоже сравниваются как числа.
поэтому луа работает быстрее всех других скриптовых языков. сравниваются не ASCII коды а хеш.
Так как вычисления выполняются над числами, то луа автоматом переводит формат из строки в числовое.
а вот сравнивать можно и числа и строки, поэтому луа не может угадать,
что Вы сравниваете и необходимо явно переводить формат.
Страницы: 1
Читают тему
Наверх