Есть скрипт, который берет данные из стакана котировок для дальнейшей работы. Если из стакана пропадают котировки (например, из-за сбоя сети), то функции возвращает Nil, скрипт отключается и его нужно включать вручную.
Можно добавить какой-нибудь код, чтобы этого отключения не было?
Sergey Gorokhov, такой вариант. При закрытии стакана или отключении инета, тут же останавливается
Код
local xxx=100
local stopped = false
function OnStop()
stopped = true
return 1000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"FXRL", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "table")
SetWindowPos(Table, 0, 10, 400, 90)
InsertRow(Table, -1)
while stopped == false do
if xxx>0 then
Quotes_1 = getQuoteLevel2("TQTF", "FXRL")
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
sleep(1000)
end
end
Leonid, очевидно Вы не поняли рекомендации. Вы говорите
Цитата
Leonid написал: функции возвращает Nil, скрипт отключается
Вам было сказано
Цитата
Sergey Gorokhov написал: добавить проверку на nil вида:если nil то ничего не делать
Вы же просто указали непонятное условие if xxx>0 then где xxx всегда при любых вариантах равно 100 и никогюда не изменится рекомендуем еще раз более внимательно прочитать рекомендацию
Leonid написал: Насколько я понял, в качестве ххх можно взять совершенно любую цифру.Как правильно тогда?
Вы говорите: "когда стакан возвращает nil код не работает" Вам говорят "добавьте проверку когда стакан возвращает nil то ничего не делать" ИЛИ (на ваш вкус) "добавьте проверку когда стакан возвращает НЕ nil то делать то что надо"
Попробовал, оба варианта, но не помогает вопрос не в том, что скрипт не работает, а в том, что он выключается и надо заново его включать нажатием play...
Код
if Quotes_1 then
xxxx
end
if Quotes_1 ~= nil then
xxxxx
end
local stopped = false
function OnStop()
stopped = true
return 1000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"FXRL", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "table")
SetWindowPos(Table, 0, 10, 400, 90)
InsertRow(Table, -1)
while stopped == false do
Quotes_1 = getQuoteLevel2("TQTF", "FXRL")
if Quotes_1 then
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
sleep(1000)
end
end
if Quotes_1 then
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
Смотрим внутрь вашего условного блока. Что сама по себе таблица получена (не nil), вы проверили в условии. Далее получаете offer_count, это ок, там какое-то число, в том числе и 0 может быть. Далее без проверки пытаетесь получить offer[1].price. Так-так, а если в offer_count был 0, сколько элементов в массиве offer? Нисколько, надо полагать? А что же будет тогда в offer[1]? Не nil ли? А что будет, если из этого нила попытаться вытащить поле price?
Leonid написал: что где может быть во всех деталях не знаю
Так вот и написал, что где может (не) быть. Дело не в луа, а вообще в подходе, на каждом выборе надо в голове составить "полную группу" всех возможных вариантов и особенно крайние случаи рассмотреть. Вариант получить nil из getQuoteLevel2 вы предусмотрели, а вариант получить пустой массив - нет.