invalid key to next

Страницы: 1
RSS
invalid key to next
 
Приветствую!

Пробую освоить qlua, скрипт получился уже приличного размера, но иногда стал останавливаться и в окошке "Ошибки выполнения скрипта"
получаю ошибку:
Цитата
invalid key to 'next'

Вопрос, как понять откуда это приходит, т.к. ни номера строки, ни какого другого намека не выдается.
 
Добрый день.

Ошибка должна ссылаться на более конкретную строку, например так:

stak.lua:4: attempt to perform arithmetic on field 'YIELD_count' (a nil value)
 
Цитата
Dmitry написал:
Приветствую!

Пробую освоить qlua, скрипт получился уже приличного размера, но иногда стал останавливаться и в окошке "Ошибки выполнения скрипта"
получаю ошибку:
Цитата
invalid key to 'next'
Вопрос, как понять откуда это приходит, т.к. ни номера строки, ни какого другого намека не выдается.
ошибка в итераторе next (table, index)
index выходит за границу таблицы, либо таблица пустая, либо таблица не существует
--------------------------------------
Можно поставить  итератор внутрь проверки
например так
if table and #table >0 and #table>=index  then
--действия с итератором  nex(table,index)
...
end
 
Цитата
Egor Zaytsev написал:
Добрый день.

Ошибка должна ссылаться на более конкретную строку, например так:

stak.lua:4: attempt to perform arithmetic on field 'YIELD_count' (a nil value)

В данном случае почему-то как раз не ссылается
 
Цитата
Николай Камынин написал:
ошибка в итераторе next (table, index)
index выходит за границу таблицы, либо таблица пустая, либо таблица не существует
--------------------------------------
Можно поставить  итератор внутрь проверки
например так
if table and #table >0 and #table>=index  then
--действия с итератором  nex(table,index)
...
end

Спасибо, понаставил такие проверки перед всеми next и for, но это к сожалению не помогло
 
Цитата
Dmitry написал:
Цитата
Николай  Камынин   написал:
ошибка в итераторе next (table, index)
index выходит за границу таблицы, либо таблица пустая, либо таблица не существует
--------------------------------------
Можно поставить  итератор внутрь проверки
например так
if table and #table >0 and #table>=index  then
--действия с итератором  nex(table,index)
...
end
Спасибо, понаставил такие проверки перед всеми next и for, но это к сожалению не помогло
Возможно, что ошибка возникает внутри функции библиотеки QLUA. .
Можно предположить (без текста скрипта сложно гадать) что ошибка возникает при запуске скрипта, когда что-то у Вас еще не инициализировано.
Попробуйте определить все начальные значения в функции init.
Если скрипт не секретный, то покажите , возможно что-то будет понятно где проблема.
 
Если совсем невмоготу, попробуйте сделать что-то вроде трассировки - выдача сообщений с локализацией достигнутого участка на терминал или в файл.
 
Скорее всего ошибка уже в том, что вы используете next() там, где следовало бы использовать pairs().  Выше вам предлагали код для проверки целочисленных индексов, а у вас, видимо, нечисловые ключи.  Если нужно найти конкретное место возникновения, то добавьте в начало файла:
Код
do
   local orig_next = next
   function next(t, i)
      if i ~= nil and t[i] == nil then
         message(debug.traceback())
      end
      return orig_next(t, i)
   end
end
Будет выдано сообщение со стеком того места, где вы вызываете next() с несуществующим ключем (код не проверял, но вроде сработает).
 
Внезапно осознал, что предложенный мною код не сработает в случае, если вы в цикле удаляете ключи (что в Lua разрешено).  Так что правильнее будет
Код
do
   local orig_next = next
   function next(t, k)
      local r, e = pcall(orig_next, t, k)
      if e then
         message(debug.traceback())
         error(e, 0)
      end
      return r
   end
end
 
М-да, перечитал документацию по next() и понял, что с кодом опять напутал (next() возвращает больше одного значения).  Нужно делать вот так:
Код
do
   local orig_next = next
   function next(t, k)
      local ok, nk, nv = pcall(orig_next, t, k)
      if not ok then
         message(debug.traceback())
         error(nk, 0)
      end
      return nk, nv
   end
end
То есть перегружаем next(), внутри вызываем исходную функцию под pcall(), если она выдала ошибку, то выдаем стек и бросаем исключение, иначе возвращаем оба результата исходной next().
Страницы: 1
Читают тему
Наверх