Как бороться с nil?

Страницы: 1
RSS
Как бороться с nil?
 
При запуске программы первый раз такой вот код выдает ошибку
Код
start6 = tonumber(getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0).totalnet) 
...
...am Files\QUIK-Junior\LuaIndicators\m2_14_BRG9_M1.lua:40: attempt to index a nil value
но если я куплю бумагу и потом ее продам например по рыночной, то после этого программа с таким кодом спокойно работает дальше и проверяет количество бумаг на остатке в различные периоды работы кода. По идее понимаю, что надо как то сделать проверку на nil и если nil, то переменной start6 присвоить ноль, но что то методом тыка пока не получилось это сделать, пробовал и так и эдак:
Код
start6 = tonumber(getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0).totalnet) or 0
...
if getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0).totalnet==nil then
start6=0
все равно программа ругается на код, подскажите пожалуйста как можно решить эту задачу?  
человек (не робот)
 
Код
fh = getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0)
if fh then start6 = fh.totalnet else start6 = 0 end
 
Вторую строчку можно записать короче:
Код
start6 = fh and fh.totalnet or 0
 
Можно еще проверить на тип возвращаемых данных
Код
type(fh) == "table"
 
Цитата
Алексей написал:
Вторую строчку можно записать короче:
Код
  start6  =  fh  and  fh.totalnet  or   0   
Спасибо всем большое за помощь, посробую вечером)
человек (не робот)
 
Да все получилось, работает). Спасибо.
человек (не робот)
 
Позвольте продолжить тему.
Есть фрагмент кода:
Код
local CheckPos = getFuturesHolding('MC0061900000',ACCOUNT,SEC_CODE,0)

if CheckPos ~= nil and POS ~= CheckPos.totalnet then
    ...
end  

В какой-то момент выпала ошибка attempt to compare with nil.

Переменная POS изначально определяется, как равная 0 и затем ей присваиваются разные значения. То есть она никогда не бывает nil. CheckPos тоже проверяется на nil, значит ошибка возникает из-за поля totalnet.

Я всегда думал, что если getFuturesHolding не возвращает nil, то все поля таблицы содержат какие-то значения и не бывают пустыми (например нули). Получается, что в определенные моменты допускается, что поля таблицы могут быть nil? Это результат ошибки или всё таки это допустимо? В каких тогда случаях может возникать nil в поле totalnet?

 
Код
if CheckPos ~= nil and POS ~= CheckPos.totalnet then

Такое сравнение вполне допустимо, даже если POS или totalnet есть nil
Ошибка в другом месте, смотрите номер строки с ошибкой.
Надо делать так, как надо. А как не надо - делать не надо.
 
О! И у меня то же самое! Я запрограммировал алгоритм снятия не сработавших (или частично сработавших) заявок, всё работает, но... не всегда: время от времени скрипт вылетает с похожей диагностикой. Стал проверять на nil возвращаемую таблицу - не помогает. :sad:  
 
Цитата
Старатель написал:
Кодif CheckPos ~= nil and POS ~= CheckPos.totalnet thenТакое сравнение вполне допустимо, даже если POS или totalnet есть nilОшибка в другом месте, смотрите номер строки с ошибкой.
Конечно я посмотрел номер строки. И ошибка возникает именно в этой строке со сравнением.
Я знаком с Луа только в пределах Квика. Возможно такое сравнение и допустимо, но Луа машина в Квике выдает ошибку при сравнении переменных, если одна из них nil...
Вообще данный случай возник лишь один раз за всё время работы скрипта. Но лучше уж знать причины возникновения ошибки.  
 
Цитата
Сергей написал:
Возможно такое сравнение и допустимо
В оригинальном Lua да.

Цитата
Сергей написал:
Луа машина в Квике выдает ошибку при сравнении переменных, если одна из них nil...
Хотел было написать, что вы заблуждаетесь, но вспомнил про странные ошибки, с которыми сам сталкивался в QUIK. Поэтому настаивать не буду.

Передаю эстафету техподдержке.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
вы заблуждаетесь
Признаю. Для сравнений равно/не равно действительно работает. Не работает только для сравнений больше/меньше...
Но у меня-то проверка равенства.. почему вообще тогда ошибка возникла? Рядом в коде больше сравнений нет. Это на случай, если я строкой ошибся..
Ну ладно, вопрос в другом. Возможно ли такое, что функция getFuturesHolding возвращает таблицу, а в ней поле totalnet = nil? И в каких случаях? Просто надо понять, как обрабатывать такой результат...
Страницы: 1
Читают тему
Наверх