You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua中如何在函数间传递变量与表?LOVE框架报错排查

问题分析与修复方案

核心错误原因

  1. drawLine调用缺失参数:在createLayer函数中调用drawLine时,未传递最后一个参数nodeNumber,导致drawLine内部访问prevLayerV[nodeNumber]时nodeNumber为nil,触发算术运算错误。
  2. 重复定义love.load:代码存在两个love.load函数,后定义的会覆盖前一个,导致窗口尺寸设置逻辑未执行。
  3. 全局变量滥用:多个函数内部变量未用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:02:59