Lua中如何在函数间传递变量与表?LOVE框架报错排查
问题分析与修复方案
核心错误原因
drawLine调用缺失参数:在createLayer函数中调用drawLine时,未传递最后一个参数nodeNumber,导致drawLine内部访问prevLayerV[nodeNumber]时nodeNumber为nil,触发算术运算错误。- 重复定义
love.load:代码存在两个love.load函数,后定义的会覆盖前一个,导致窗口尺寸设置逻辑未执行。 - 全局变量滥用:多个函数内部变量未用
local声明,易引发意外的变量污染。
修复后的完整代码
layer0v = {0} layer0b = {1} layer1v = {} layer1b = {} xValues = {0} nodeNumber = 1 curLayer = 1 canvWidth = 800 canvHeight = 512 -- 生成x轴坐标值,优化插入逻辑 repeat table.insert(xValues, xValues[#xValues] + 5) until xValues[#xValues] == canvWidth function calculateX(curLayer, xValues) local value = xValues[curLayer] return value end function calculateWV(prevLayerV, prevLayerB, nodeNumber) local value = prevLayerV[nodeNumber] + prevLayerB[nodeNumber] return value end function calculateLV(prevLayerV, prevLayerB, nodeNumber) local value = prevLayerV[nodeNumber] - prevLayerB[nodeNumber] return value end function calculateWB() local value = 1 return value end function calculateLB(prevLayerB, nodeNumber) local value = prevLayerB[nodeNumber] * 2 return value end function addToTable(curLayerV, curLayerB, prevLayerV, prevLayerB, nodeNumber) table.insert(curLayerV, calculateWV(prevLayerV, prevLayerB, nodeNumber)) table.insert(curLayerV, calculateLV(prevLayerV, prevLayerB, nodeNumber)) table.insert(curLayerB, calculateWB()) table.insert(curLayerB, calculateLB(prevLayerB, nodeNumber)) end function drawLine(curLayerV, curLayerB, curLayerX, prevLayerV, prevLayerB, prevLayerX, nodeNumber) love.graphics.line(prevLayerX, prevLayerV[nodeNumber] + 128, curLayerX, calculateWV(prevLayerV, prevLayerB, nodeNumber) + 128) love.graphics.line(prevLayerX, prevLayerV[nodeNumber] + 128, curLayerX, calculateLV(prevLayerV, prevLayerB, nodeNumber) + 128) end function createLayer(curLayerV, curLayerB, prevLayerV, prevLayerB, nodeNumber, curLayer, xValues) nodeNumber = 1 repeat addToTable(curLayerV, curLayerB, prevLayerV, prevLayerB, nodeNumber) -- 补充缺失的nodeNumber参数 drawLine(curLayerV, curLayerB, calculateX(curLayer, xValues), prevLayerV, prevLayerB, calculateX(curLayer - 1, xValues), nodeNumber) if nodeNumber ~= #prevLayerV then nodeNumber = nodeNumber + 1 end until nodeNumber == #prevLayerV end function love.load() love.window.setMode(canvWidth, canvHeight) createLayer(layer1v, layer1b, layer0v, layer0b, nodeNumber, curLayer, xValues) end -- LOVE框架必须通过love.draw执行绘制逻辑 function love.draw() -- 绘制各轮次的盈亏节点 for i, v in ipairs(layer0v) do love.graphics.circle("fill", calculateX(0, xValues), v + 128, 3) end for i, v in ipairs(layer1v) do love.graphics.circle("fill", calculateX(1, xValues), v + 128, 3) end end
额外优化说明
- 合并两个
love.load函数,确保窗口设置与图层创建逻辑都能执行。 - 为函数内部变量添加
local声明,避免全局变量污染。 - 优化
table.insert调用方式,省略不必要的位置参数(默认插入至表末尾)。 - 添加
love.draw函数,LOVE框架中所有绘制操作必须在此函数内执行,否则内容无法显示。 - 补充节点绘制逻辑,便于直观查看各轮次的盈亏节点。
内容的提问来源于stack exchange,提问作者James Hood
相关产品推荐
相关产品推荐

