2016-09-12 4 views
-4

По какой-то причине Lua говорит мне, что эта строка делает ошибку:Lua Таблица равна нулю

for i=1, #set do 

Где множество является 2-мерная таблицы параметров функции я сделал. Это дает мне ошибку:

Attempt to get length of a nil value (local set)

Странная вещь, что я бегу эту функцию более чем в 1000 раз, но ошибка появляется только один раз. Я не совсем уверен, почему. Любая помощь будет оценена по достоинству. А также я могу печатать значения из набора, и они появятся, я думаю, что это возможная ошибка.

Edit: это функция: (или важная часть его)

function GeneticTrainer:evaluate(id,correct,set) 
local returny=0 
local net=self.Networks[id] 
for i=1, #set do 
    -- print(i..k[i]) 
    net:Update(set[i]) 

    local error= math.abs(correct[i]-net.output[1]) 
    returny = returny + (1-(error/10)) 
end 

И это, где я это называю:

function GeneticTrainer:Evolve(Problem,Set) 
local A=math.random(1,self.Population) 
local B=math.random(1,self.Population) 
if A==B then 
    B=math.random(1,self.Population) 
end 
local AFitness = self:evaluate(A,Problem,Set) 
local BFitness = self:evaluate(B,Problem,Set) 

И это где я называю это:

BinarySet={{0,0},{1,0},{0,1},{1,1}} 

for i=1, iterations do GATrainer:Evolve(Target,BinarySet) end

+7

По-видимому, 'set' был' nil'. Невозможно узнать, почему это произошло, если вы не публикуете соответствующий код, желательно как [MCVE]. – interjay

+0

Ваш 'net: Update' модифицирует' set' в любом случае или изменяет количество элементов, пока он все еще выполняет итерацию через цикл? – greatwolf

ответ

1
function GeneticTrainer:evaluate(id,correct,set) 
    local returny=0 
    local net=self.Networks[id] 
    for i=1, #set do -- this line causes the error! 
    -- an so on... 

Ошибка вызвана в вышеуказанном сегменте кода, строка 4. Поскольку, очевидно, не asigment в set между функцией заголовка и #set, set необходимо ввести функцию nil

Так следующий вы проверить где вы называют GeneticTrainer:evaluate(id,correct,set) который бывает так:

function GeneticTrainer:Evolve(Problem,Set) 
    local A=math.random(1,self.Population) 
    local B=math.random(1,self.Population) 
    if A==B then 
    B=math.random(1,self.Population) 
    end 
    local AFitness = self:evaluate(A,Problem,Set) 
    local BFitness = self:evaluate(B,Problem,Set) 

поскольку не существует, очевидно, никаких изменений в Set, который входит в функцию GeneticTrainer:Evolve(Problem,Set), а затем self:evaluate(B,Problem,Set), а на ноль значение должно происходить вне этой функции.

Дополнительный код не предусмотрен. То, что вы вызываете функцию 1000 раз без ошибок, не означает, что она не может вызвать ошибку, если вы вызываете ее с разными параметрами в 1001-й раз.

Просто следуйте set через стек вызовов, и вы найдете эту проблему.

У вас должна быть трассировка стека с сообщением об ошибке, в котором указывается, в какой строке вы вызываете каждую функцию.

Это очень просто, и вам понадобится сделать это или подобное миллион раз, как программист. Вы не нуждаетесь в нас, чтобы помочь вам здесь.

Edit:

Afer ваши комментарии я уменьшил свой код до минимума (то, что вы должны были сделать для вашего вопроса) и побежал через Lua онлайн демо без каких-либо проблем на всех. https://www.lua.org/cgi-bin/demo

Я также проверил его с другим интерпретатором Lua, используя 5000 итераций без проблем.

function eval(id,correct,set) 
    print(#set) 
end 

function evolve(Problem,Set) 
    local AFitness = eval(A,Problem,Set) 
    local BFitness = eval(B,Problem,Set) 
end 

    BinarySet={{0,0},{1,0},{0,1},{1,1}} 
for i=1, 10 do 
    evolve(Target,BinarySet) 
end 

Я бы сказал, что это совсем невозможно, что в недавно построенной Lua есть ошибка, из-за которой таблицы исчезают. Проверьте код еще раз.

+0

Ну, но набор не ноль, потому что я могу печатать из него значения. Я могу сказать «print (set [1] [1]), и он печатает. Возможно, это ошибка? –

+0

Вы напечатали это право перед линией, вызывает ошибку? .. nil is nil. Таблица не исчезает. Может быть, опечатка? Set vs set где-нибудь? – Piglet

+0

Да! Я сделал распечатку точно до нее, и она распечатывается отлично, а затем вызывает ошибку –