【问题标题】:Lua PANIC errorLua PANIC 错误
【发布时间】:2014-10-14 12:54:11
【问题描述】:

我正在用 C++ 创建一个数独求解器,同时实现 Lua 脚本以实际解决难题。我已经创建了以下 Lua 代码,但是得到了一个

PANIC:调用 Lua API 时出现不受保护的错误(尝试调用 nil 值)

每当我的 C++ 代码到达 lua_call 的第一个实例时都会出错。 在 SciTE 中编译代码时,出现以下错误:

lua: SudokuSolver.lua:99: 'end' 预期(在第 61 行关闭 'for') 靠近''

在第 61 行具有 for 循环的函数末尾添加三个 'end' 可以清除该错误,但会导致 C++ 程序出错。有人可以看看我的 Lua,看看是否有任何语法错误或其他可能导致这种情况的问题?谢谢

代码

-- Table Declaration
SudokuGrid = {}

function RecieveGrid ( _Pos, _Value )
    -- Recives the cell value at _Pos position from C++
    SudokuGrid[_Pos] = _Value
end

function SolveSudoku ( _Pos )
    -- Recursive function which solves the sudoku puzzle
    local iNewValue = 1

    -- If Position is 82+, all cells are solved
    if( _Pos >= 82 ) then
        return true
    end

    -- If Position already has a value
    if( SudokuGrid[_Pos] ~= 0) then
        return SolveSudoku( _Pos + 1 )
    else
        while(true) do
            SudokuGrid[_Pos] = iNewValue
            iNewValue = iNewValue + 1

            -- If the new value of the cell is higher than 9 its not valid
            if( SudokuGrid[_Pos] > 9 ) then
                --Reset value
                SudokuGrid[_Pos] = 0
                return false
            end

            if( IsValid( _Pos ) and SolveSudoku( _Pos + 1 ) ) then
                return true
            end
        end
    end
end

function IsValid ( _Pos )
    -- Calculate Column and Row in Grid
    x = _Pos % 9
    if( x == 0 ) then
        x = 9
    end
    y = math.ceil(_Pos / 9)

    -- Check Rows
    for i=1, 9 do
        CheckVal = ((y - 1)  * 9) + i
        if( CheckVal == _Pos ) then
            -- Do nothing
        else if ( SudokuGrid[_Pos] == SudokuGrid[CheckVal]and SudokuGrid[_Pos] ~= 0 ) then
            return false
        else
            -- Do nothing
        end
    end

    -- Check Columns
    for i=1, 9 do
        CheckVal = ((i - 1) * 9) + x
        if( CheckVal == _Pos ) then
            -- Do nothing
        else if ( SudokuGrid[_Pos] == SudokuGrid[CheckVal] and SudokuGrid[_Pos] ~= 0 ) then
            return false
        else
            -- Do nothing
        end
    end

    -- Check 3X3 Grid
    SquareCol = math.ceil(x/3)
    SquareRow = math.ceil(y/3)
    StartVal = (SquareCol - 1) * 27 + (SquareRow * 3) -2
    for j=0, 2 do
        for i=0, 2 do
            CheckVal = StartVal + i
            if( CheckVal == _Pos ) then
                -- Do nothing
            else if ( SudokuGrid[_Pos] == SudokuGrid[CheckVal] and SudokuGrid[_Pos] ~= 0 ) then
                return false
            else
                -- Do nothing
            end
        end
        StartVal = StartVal + 9
    end

    return true
end

function SendGrid ( _Pos )
    -- Sends the value at _Pos to C++
    return SudokuGrid[_Pos]
end

【问题讨论】:

标签: c++ lua


【解决方案1】:

语法错误出现在所有包含else if的行中:

else if ( SudokuGrid[_Pos] == SudokuGrid[CheckVal]and SudokuGrid[_Pos] ~= 0 ) then

在 Lua 中,使用 elseif 代替。使用else if 需要更多关闭end

elseif SudokuGrid[_Pos] == SudokuGrid[CheckVal] and SudokuGrid[_Pos] ~= 0 then

【讨论】:

  • 谢谢!这正是它的本来面目。
猜你喜欢
  • 2018-08-09
  • 2021-09-06
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2015-06-02
  • 2017-01-18
  • 2010-12-12
相关资源
最近更新 更多