Question

I'm getting a very irritating error whenever I do anything like this with arrays. I have code that sets up the array in the love.load() function:

function iceToolsInit()
    objectArray = {} --for object handling
    objectArrayLocation = 0
end

and then code that allows for the creation of an object. It basically grabs all of the info about said object and plugs it into an array.

function createObject(x, y, renderimage) --used in the load function
    --objectArray is set up in the init function
    objectArrayLocation = objectArrayLocation + 1
    objectArray[objectArrayLocation] = {}
    objectArray[objectArrayLocation]["X"] = x
    objectArray[objectArrayLocation]["Y"] = y
    objectArray[objectArrayLocation]["renderimage"] = 
        love.graphics.newImage(renderimage)
end

After this, an update function reads through the objectArray and renders the images accordingly:

function refreshObjects() --made for the update function
    arrayLength = #objectArray
    arraySearch = 0
    while arraySearch <= arrayLength do
        arraySearch = arraySearch + 1
        renderX = objectArray[arraySearch]["X"]
        renderY = objectArray[arraySearch]["Y"]
        renderimage = objectArray[arraySearch]["renderimage"]
        if movingLeft == true then --rotation for rightfacing images
            renderRotation = 120
        else
            renderRotation = 0
        end
        love.graphics.draw(renderimage, renderX, renderY, renderRotation)
    end
end

I of course clipped some unneeded code (just extra parameters in the array such as width and height) but you get the gist. When I set up this code to make one object and render it, I get this error:

attempt to index '?' (a nil value)

the line it points to is this line:

renderX = objectArray[arraySearch]["X"]

Does anyone know what's wrong here, and how I could prevent it in the future? I really need help with this.

Was it helpful?

Solution

It's off-by-one error:

arraySearch = 0
while arraySearch <= arrayLength do
    arraySearch = arraySearch + 1

You run through the loop arrayLength+1 number of times, going through indexes 1..arrayLength+1. You want to go through the loop only arrayLength number of times with indexes 1..arrayLength. The solution is to change the condition to arraySearch < arrayLength.

Another (more Lua-ly way) is to write this as:

for arraySearch = 1, #objectArray do

Even more Lua-ly way is to use ipairs and table.field reference instead of (table["field"]):

function refreshObjects()
  for _, el in ipairs(objectArray) do
    love.graphics.draw(el.renderimage, el.X, el.Y, movingLeft and 120 or 0)
  end
end

objectArray and movingLeft should probably be passed as parameters...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top