【问题标题】:Lua <eof> expected near 'print'Lua <eof> 预计在“打印”附近
【发布时间】:2023-09-24 10:28:01
【问题描述】:

我在 lua 中遇到问题。

问题一: 每次我运行以下程序时,控制台都会告诉我:

'end' 预期在'local'附近(在第 1 行关闭'function')

请注意我在所有大写字母中标记了有关错误的详细信息

function m11()
    local inst = mc.mcGetInstance() -- controller instance
    local gcodeLineNbr = mc.mcCntlGetGcodeLineNbr(inst) -- get current Gcode line number
    local gcodeLineStr = mc.mcCntlGetGcodeLine(inst, gcodeLineNbr)  -- get current Gcode line


    function valFromLine(string, axis)
        local startPoint = string.find(string, axis) + 1
        local outputVal = ""
        local isNum = true
        while isNum do
            local num = string.sub(string, startPoint, startPoint)
            startPoint = startPoint + 1
            if num ~= " " then
                outputVal = outputVal .. num
            else
                isNum = false
            end
        end
        outputVal = tonumber(outputVal)
    end
    return outputVal

    --COMPILER HIGHLIGHTS FOLLOWING LINE AS LOCATION OF ERROR
    local gcodeLocX = valFromLine(gcodeLineStr, "X")
    local curLocX = mc.mcAxisGetPos(inst, 0)        -- get current X axis value
    local curLocY = mc.mcAxisGetPos(inst, 1)        -- get current Y axis value
    local curLocZ = mc.mcAxisGetPos(inst, 2)        -- get current Z axis value
    local curAngB = mc.mcAxisGetPos(inst, 4)        -- get current C axis value
    local curAngC = mc.mcAxisGetPos(inst, 5)        -- get current C axis value
    local toolOffset = mc.mcCntlGetToolOffset(inst, 2)  -- get tool offset for axis Z

    function rotateToolB()
        local comHypot = toolOffset * math.sin(angle)       -- get XY planar dist from C pivot to tool centre point
        local compDestinX = comHypot * math.sin(math.rad(90) - curAxisC + curLocX
    end
end
--END OF M11() FUNCTION SHOULD BE HERE

if (mc.mcInEditor() == 1) then
    m11()
end

我不明白为什么它期望 m11() 这么早关闭。

问题二: 我在一个完全独立的文件中重写了 valFromLine(),我得到:

'eof' 预计在 'print' 附近

function valFromLine(string, axis)
    local startPoint = string.find(string, axis) + 1
    local outputVal = ""
    local isNum = true
    while isNum do
        local num = string.sub(string, startPoint, startPoint)
        startPoint = startPoint + 1
        if num ~= " " then
            outputVal = outputVal .. num
        else
            isNum = false
        end
    end
  outputVal = tonumber(outputVal)
end
return outputVal

print(valFromLine("GO1 X254.348 Y1039.456 Z150.13 B90.23 C13 M11", "X"))

我已经计算了我的“结束”语句,在这两个代码示例中都找不到它们的问题。在这一点上,我完全失去了想法,请帮忙。谢谢。

【问题讨论】:

    标签: lua eof zerobrane


    【解决方案1】:

    return outputVal 行的位置错误。将其移入函数 valFromLine。 不能在函数外返回。

    正确:

    function someFunction()
      -- do something
      local something = "something"
      return something
    end
    

    错误:

    function someFunction()
      -- do something
      local something = "something"
    end
    return something
    

    用函数定义全局函数也不是很干净,使用局部函数。

    【讨论】:

    • 别忘了它必须是函数中的最后项。
    • 可以从函数外部返回。或者,更准确地说,你不能离开函数,因为 Lua 中的“文件”是隐式可变参数函数。在return 语句之后不能有更多语句的实际错误,因此print 行失败。
    • @ColonelThirtyTwo 我写了“the”函数。抱歉,如果这不够精确。感谢您的提示。
    • 谢谢warspyking。我认为我的位置是正确的,因为我引用了一个程序的 API 指南,它显示了一个在“结束”之后写“返回”的示例。正如你可能猜到的,我刚刚开始为这个项目学习 Lua。再次感谢。