Ошибка attempt to index a function value при обращении к таблице из getCandlesByIndex

Страницы: 1
RSS
Ошибка attempt to index a function value при обращении к таблице из getCandlesByIndex
 
Здравствуйте!
Есть функция чтения последней свечи, которая несколько лет работала стабильно, но последнее время, раз в несколько дней выдает ошибку(хотя свечи на графике есть).
Функция читает таблицу с одной последней свечой в tab2. Иногда при попытке обратиться к таблице по индексу " if (tab2[0]==nil) then " - вылетает ошибка "attempt to index a function value (local 'tab2')"
Добавил проверку tab2==nil, и она в момент ошибки не срабатывает, т.е. tab2 - задана.
Код
function last_condle() -- самая последняя свеча
   local tmp_max=getNumCandles(options.future.."_price")
   local tab2, n1, tmpname=getCandlesByIndex(options.future.."_price", 0,tmp_max-1, 1) 

        -- Костыль №1
   if (tab2==nil) then
      say(" Ошибка 1748 - нет данных!!! - входим в режим ожидания данных tmp_max="..tmp_max)
      while (tab2==nil) do
         sleep(731)
         tab2, n1, tmpname=getCandlesByIndex(options.future.."_price", 0,tmp_max-1, 1)    
      end 
   end   

   -- Костыль №2
   if (tab2[0]==nil) then -- Тут иногда ошибка "attempt to index a function value (local 'tab2')"
      say(" Ошибка 1739 - нет данных!!! - входим в режим ожидания данных tmp_max="..tmp_max)
      while (tab2[0]==nil) do
         sleep(731)
         tab2, n1, tmpname=getCandlesByIndex(options.future.."_price", 0,tmp_max-1, 1)    
      end 
   end

   return tab2[0]
end
Если я правильно понимаю, LUA считает что tab2 - функция? Но getCandlesByIndex не должен функий выдавать. Как это вылечить?

LUA 5.4.1
 
В справке по Qlua, к сожалению, не указано, что возвращается в случае не получения данных данной функции.
Я при проверке этой функции сравниваю получаемую таблицу и ее значения не с nil, а с false (т.е. if (not tab2) и if (not tab2[0])).
Пока работает.
 
Цитата
Игорь Б написал:
В справке по Qlua, к сожалению, не указано, что возвращается в случае не получения данных данной функции.Я при проверке этой функции сравниваю получаемую таблицу и ее значения не с nil, а с false (т.е. if (not tab2) и if (not tab2[0])).Пока работает.
Спасибо, попробую Ваш вариант. Странно, что вообще это происходит днем, когда свечи есть.  
 
Цитата
Сергей написал:
Здравствуйте!
Есть функция чтения последней свечи, которая несколько лет работала стабильно, но последнее время, раз в несколько дней выдает ошибку(хотя свечи на графике есть).
Функция читает таблицу с одной последней свечой в tab2. Иногда при попытке обратиться к таблице по индексу " if (tab2[0]==nil) then " - вылетает ошибка "attempt to index a function value (local 'tab2')"
Добавил проверку tab2==nil, и она в момент ошибки не срабатывает, т.е. tab2 - задана.
Код
   function   last_condle ()  -- самая последняя свеча 
    local  tmp_max =  getNumCandles (options.future .. "_price")
    local  tab2, n1, tmpname =  getCandlesByIndex (options.future .. "_price",  0 ,tmp_max -  1 ,  1 ) 

         -- Костыль №1 
    if  (tab2 =  =  nil )  then 
      say( " Ошибка 1748 - нет данных!!! - входим в режим ожидания данных tmp_max="  .. tmp_max)
       while  (tab2 =  =  nil )  do 
          sleep ( 731 )
         tab2, n1, tmpname =  getCandlesByIndex (options.future .. "_price",  0 ,tmp_max -  1 ,  1 )    
       end  
    end    

    -- Костыль №2 
    if  (tab2[ 0 ] =  =  nil )  then   -- Тут иногда ошибка "attempt to index a function value (local 'tab2')" 
      say( " Ошибка 1739 - нет данных!!! - входим в режим ожидания данных tmp_max="  .. tmp_max)
       while  (tab2[ 0 ] =  =  nil )  do 
          sleep ( 731 )
         tab2, n1, tmpname =  getCandlesByIndex (options.future .. "_price",  0 ,tmp_max -  1 ,  1 )    
       end  
    end 

    return  tab2[ 0 ]
 end 
  
Если я правильно понимаю, LUA считает что tab2 - функция? Но getCandlesByIndex не должен функий выдавать. Как это вылечить?

LUA 5.4.1
У Вас ошибка при обращении к нулевому индексу в таблице.
Т е обращение к такому индексу происходит первый раз. Это подобно обращению за границы таблицы.
Т е не ни элемента, а индекса ноль. Но при этом сама таблица существует.
----------------------------------
Но в первом случае Вы проверяете на nil не индекс а само значение ,
а во втором Вы проверяете опять не индекс а существование таблицы.
--------------------------
Вот Вам система и говорит что индекса 0 нет, а не значения и не таблицы.
Как минимум Вам надо проверять число элементов в таблице.   т е  (#tab2~=0)
Но так как стандартно в таблицу пишется всегда с 1, а запись нулевого элемента - это творчество разработчиков QLUA, то проверка  числа элементов таблицы может быть недостаточна.
---------------------
Теперь понятно?
 
Цитата
nikolz написал:
Теперь понятно?
Тогда простой пример тоже должен выдавать ошибку:
Код
local test_tab={}
   if (test_tab[0]==nil) then 
      say("1")
   else
      say("2")
   end
Однако всё работает. Результат "1". Подозреваю, что getCandlesByIndex - иногда выдает не таблицу, и тогда #tab2~=0 - тоже выдаст ошибку.
Видимо, в моем случае, надо перед проверкой индекса так же добавить проверку на тип "table".  
Страницы: 1
Читают тему (гостей: 1)
Наверх