Hi, i'm working on a project with this function;
function amount_living_neighbours(x, y, board) local res = 0 for i= -1, 1 do for j = -1,1 do if i == 0 and j == 0 then goto continue end if x+i >= 0 and x+i <= 127 and y+j >= 0 and y+j <= 127 then if board[x+i][y+j] == white then res += 1 end end ::continue:: end end return res end |
and the interpreter tells me that i'm attempting to index a field ? in the line "if board[x+i][y+j] == white then " i.e it's null. Should'nt lua interpret it as a parameter and not as a nil? i'm not acquantained to the language and seems pretty nasty to use globals with this code.
Are you sure you're setting the board argument to a table value? I tested your function in my copy of PICO-8 along with setting up a 2D board array and the white global, and it seems to work just fine:
white=7 b={} for x=0,127 do b[x]={} for y=0,127 do b[x][y]=white end end function amount_living_neighbours(x, y, board) local res = 0 for i= -1, 1 do for j = -1,1 do if i == 0 and j == 0 then goto continue end if x+i >= 0 and x+i <= 127 and y+j >= 0 and y+j <= 127 then if board[x+i][y+j] == white then res += 1 end end ::continue:: end end return res end ?amount_living_neighbours(0,0,b) |
Running this code prints 3, as they're 3 neighboring "white" pixels in the very top-left of my 2D array.
How are you setting up the board on your end, and how are you calling this function?
Thanks for the response, i found the mistake. I was initializing the table correctly but the if condition tries to access to board[0]; that provoques the nil. It's hard to get used to the tables starting at 1 xD
So the problem was, were you initializing the array starting at 1, but read the array starting at 0?
What programming languages besides Lua have you came from?
Think of tables in Lua as a superset of lists, sets, arrays, and dictionaries. You can basically use them in place of any of those more-strictly-defined things.
As for the 1-based thing, yeah, that sucks, but it is what it is at this point. You can always treat them as 0-based if you do it manually. For instance, you can convert this 1-based initialization:
t = {3,4,5} |
To 0-based by using the feature that allows initializing specific keys, to set the first value at t[0], and the rest as usual starting at t[1] and going up:
t = {[0]=3,4,5} |
Lua won't consider t[0] part of what it calls its "sequence" elements, i.e. the stuff from t[1] to t[#t] that can be manipulated with del(t,?) or all(t) or ipairs(t), but you can if you handle all array stuff manually, like you might in C/C++. You just have to be careful not to rely on #t, as it doesn't know about t[0]. Track the count manually with a t.n value, or test for nil as a sentinel value:
for i=0,t.n-1 do ... end for i=0,32767 do if(t[i]==nil) break ... end |
It's surprising, though, just how often you really don't need 0-based indexing. As someone who grew up on C/C++, I adore 0-based indexing and it took me a long time to come around, but there's just a ton of stuff where the index doesn't really matter, only the order of the indices.
[Please log in to post a comment]