Lua / 为什么向矩阵中添加新元素会覆盖之前添加的元素?
Lua / Why does adding a new element to a matrix overwrites previously added one?
我正在学习 Lua,所以我决定尝试实现一个从数组获取坐标并输出 ASCII 图片的函数。
只要我没有在一行中放置几个点(纵坐标)就一切正常:
它输出这个
...X
.X..
..X.
...X
而不是这个
XXXX
.X..
..X.
...X
经过一些调查,我得出的结论是,除了 create_massive()
之外,所有本地函数都运行良好。当它放置一个点时,先前添加在同一 y 轴上的点将被删除。
澄清一下,我是这样得出结论的:
我简单地删除了函数 create_massive()
并自己定义了它庞大的 drawing
:
local n=nil
drawing={
{1,1,1,1},
{n,1,n,n},
{n,n,1,n},
{n,n,n,1},
}
然后程序输出了我想要的。
完整代码
我可以只留下函数 create_massive()
因为只需要修复它,但我认为完整的代码会更有帮助:
function draw(coords,sym,spc)
local sym = sym or "X" -- dot
local spc = spc or "-" -- empty slot
local max={} -- massive containing max co-ordinates
local min={} -- massive containing min co-ordinates
local drawing={} -- massive containing drawing
local function find_min_max()
-- finds min/max co-ordinates
for i=1,#coords do
local c=coords[i]
if i%2~=0 then
max.x=max.x and ((c>max.x) and c or max.x) or c
min.x=min.x and ((c<min.x) and c or min.x) or c
else
max.y=min.y and ((c>max.y) and c or max.y) or c
min.y=min.y and ((c<min.y) and c or min.y) or c
end
end
end
local function create_massive()
-- creates massive containing drawing
for i=2,#coords,2 do
local y=coords[i]
local x=coords[i-1]
drawing[y]={[x]=1} -- the thing is, it overwrites previous dots' position, so line can contain only the last called dot
end
end
local function print_drawing()
local n=1
local line={}
for i=min.y,max.y do
if drawing[i] then
for k=min.x,max.x do
if drawing[i][k] then
line[n]=line[n] and line[n]..sym or sym
else
line[n]=line[n] and line[n]..spc or spc
end
if k==max.x then
n=n+1
end
end
else
for p=min.x,max.x do
line[n]=line[n] and line[n]..spc or spc
end
n=n+1
end
end
for i=1,#line do
print(line[i])
end
end
find_min_max()
create_massive() -- probably this function works incorrect
print_drawing()
end
m={1,1,2,1,3,1,4,1,2,2,3,3,4,4} -- co-ordinates: even indexes of the array are y, others are x
draw(m) -- main function is called
drawing[y]={[x]=1}
创建一个包含单个条目的新行。
尝试drawing[y][x]=1
。
我正在学习 Lua,所以我决定尝试实现一个从数组获取坐标并输出 ASCII 图片的函数。
只要我没有在一行中放置几个点(纵坐标)就一切正常:
它输出这个
...X
.X..
..X.
...X
而不是这个
XXXX
.X..
..X.
...X
经过一些调查,我得出的结论是,除了 create_massive()
之外,所有本地函数都运行良好。当它放置一个点时,先前添加在同一 y 轴上的点将被删除。
澄清一下,我是这样得出结论的:
我简单地删除了函数 create_massive()
并自己定义了它庞大的 drawing
:
local n=nil
drawing={
{1,1,1,1},
{n,1,n,n},
{n,n,1,n},
{n,n,n,1},
}
然后程序输出了我想要的。
完整代码
我可以只留下函数 create_massive()
因为只需要修复它,但我认为完整的代码会更有帮助:
function draw(coords,sym,spc)
local sym = sym or "X" -- dot
local spc = spc or "-" -- empty slot
local max={} -- massive containing max co-ordinates
local min={} -- massive containing min co-ordinates
local drawing={} -- massive containing drawing
local function find_min_max()
-- finds min/max co-ordinates
for i=1,#coords do
local c=coords[i]
if i%2~=0 then
max.x=max.x and ((c>max.x) and c or max.x) or c
min.x=min.x and ((c<min.x) and c or min.x) or c
else
max.y=min.y and ((c>max.y) and c or max.y) or c
min.y=min.y and ((c<min.y) and c or min.y) or c
end
end
end
local function create_massive()
-- creates massive containing drawing
for i=2,#coords,2 do
local y=coords[i]
local x=coords[i-1]
drawing[y]={[x]=1} -- the thing is, it overwrites previous dots' position, so line can contain only the last called dot
end
end
local function print_drawing()
local n=1
local line={}
for i=min.y,max.y do
if drawing[i] then
for k=min.x,max.x do
if drawing[i][k] then
line[n]=line[n] and line[n]..sym or sym
else
line[n]=line[n] and line[n]..spc or spc
end
if k==max.x then
n=n+1
end
end
else
for p=min.x,max.x do
line[n]=line[n] and line[n]..spc or spc
end
n=n+1
end
end
for i=1,#line do
print(line[i])
end
end
find_min_max()
create_massive() -- probably this function works incorrect
print_drawing()
end
m={1,1,2,1,3,1,4,1,2,2,3,3,4,4} -- co-ordinates: even indexes of the array are y, others are x
draw(m) -- main function is called
drawing[y]={[x]=1}
创建一个包含单个条目的新行。
尝试drawing[y][x]=1
。