2009-08-12 17 views
6

Estoy tratando de escribir un script lua para ayudar a modificar un juego, y sigue rompiendo una línea particular de una de las bibliotecas de mi asistente.Intento de indexar un valor nulo en un script

odfWriter.lua:

require 'loopsetup' 
require 'ioWriter' 
local open = {} 
odfWriter = class{ 
    writer = false 
} 
odfWriter[open] = false 

function odfWriter:open(name) 
    if not self[open] then 
     self.writer = ioWriter() 
     self.writer:open(name) 
     self[open] = true 
    else 
     error("tried to open an already open writer") 
    end 
end 

function odfWriter:write(args) 
    self.writer:write(args.Key .. " = ") --<-- error is here, when trying to access args 
    if args.Type == "seqstrings" then 
     for k,v in pairs(args.Value) do 
      self.writer:write("\"" .. v .. "\" ") 
     end 
    elseif args.Type == "string" then 
     self.writer:write("\"" .. args.Value .. "\"") 
    elseif args.Type == "seqnumbers" then 
     for k,v in pairs(args.Value) do 
      self.writer:write(tostring(v) .. " ") 
     end 
    elseif args.Type == "number" then 
     self.writer:write(tostring(args.Value)) 
    elseif args.Type == "boolean" then 
     if args.Value == true then 
      self.writer:write("1") 
     elseif args.Value == false then 
      self.writer:write("0") 
     end 
    end 
    self.writer:write("\n") 
end 
function odfWriter:close() 
    if self[open] then 
     self.writer:close() 
     self.writer = false 
     self[open] = false 
    else 
     error("tried to close an already closed writer") 
    end 
end 

loopSetup.lua

----------------------------------------------------------------------- 
-- file  : loopsetup.lua 
-- description : provides global access to all of the (known) members 
--    of the loop.simple code (for easier access) 
----------------------------------------------------------------------- 
require 'loop.simple' 
class = loop.simple.class 
classof = loop.simple.classof 
initclass = loop.simple.initclass 
instanceof = loop.simple.instanceof 
isclass = loop.simple.isclass 
memberof = loop.simple.memberof 
members = loop.simple.members 
new = loop.simple.new 
rawnew = loop.simple.rawnew 
subclassof = loop.simple.subclassof 
superclass = loop.simple.superclass 

ioWriter.lua: Código

local loaded = require('loopsetup') 
assert(loaded, 'loopsetup not loaded') 
local open = {} 
ioWriter = class{ 
    stream = false 
} 
ioWriter[open] = false 
function ioWriter:open(name) 
    if not self[open] then 
     self.stream = io.open(name, "w") 
     self[open] = true 
    else 
     error("attempted to open an already open writer") 
    end 
end 
function ioWriter:write(str) 
    self.stream:write(str) 
end 
function ioWriter:writeLine(str) 
    self.stream:write(str .. '\n') 
end 
function ioWriter:close(self) 
    if self[open] then 
     self.stream:flush() 
     self.stream:close() 
     self.stream = false 
     self[open] = false 
    else 
     error("attempted to close an already closed writer") 
    end 
end 

prueba:

require 'loopsetup' 
require 'odfWriter' 
local odf = odfWriter() 
odf:open('test.odf') 
local line1Data = { 
    Type = "seqstrings", 
    Key = "engineTargetHardpoints", 
    Value = {"hp01", "hp02", "hp03"} 
} 
odf:write(line1data) 
odf:close() 

¿Por qué tengo este error cuando estoy claramente pasando una tabla válida a odfwriter.write?

+0

Solo por curiosidad, ¿qué juego estás modificando? –

+0

Un antiguo, en realidad una modificación de uno. Star Trek Armada 2 Operaciones de flota. Está en www.fletops.net – RCIX

+0

+1 para una pregunta bien presentada. – RBerteig

Respuesta

5

Al menos en su código de prueba, que tienen un error tipográfico:

line1data ~= line1Data 

También tiene un error tipográfico en ioWriter.lua en el método de cierre:

function ioWriter:close(self) 

debería ser

function ioWriter:close() 
+0

Gracias, ¿por qué no los vi? el error clásico del programador ataca nuevamente ... – RCIX

1

No ha verificado explícitamente que todo lo que implementa odf:open() tuvo éxito. Mi preocupación es que parece que todo el control de flujo en odf:open() parece suponer que todo fue exitoso. ¿Es posible que no lo haya hecho y, como resultado, en la línea indicada, el error se haya producido al intentar indexar self.writer que contenga nil?

Podría ser nil en comparación con false si odfWriter:open() no ejecutó correctamente el constructor self.writer = ioWriter() por ejemplo. No soy un usuario habitual de bucle, así que podría estar ladrando el árbol equivocado, pero ...

Si eso sucediera, sería fácil recibir un mensaje confuso sobre qué índice fue el culpable. .

Tal vez dejar caer llamadas a assert() en unos pocos lugares sería productivo.

Cuestiones relacionadas