首页 > 解决方案 > 错误:在为表赋值时尝试对 nil 值(字段“?”)执行算术运算

问题描述

 --An assembly in lua

    registerA = 0 --Primary Register(Default mem used by all programs)
    registerB = 0 --Secondary Register(Default mem used by  programs that need 2nd operand)
    registerCounter = 1 --Current register position
    registerOpcode = {}  --+-Holds the decoded assembly
    registerOperand = {} --+
    opcode = true        --Swich between oprand and opcode
    error = ""
    
    opcodes = {
      "NUL",
      "ADD",
      "SUB",
      "MUL",
      "DIV",
      "JMP",
      "LDA",
      "LDB",
      "STA",
      "STB"
    }
    
    
    function decodeOpcode(val)
      for key,instruction in pairs(opcodes) do
        if instruction == val then
          return key
        end
      end
      error = "Bad instruction["..math.ceil(registerCounter/2).."]"
      return 0
    end
    
    function decode()
      file = io.open("main.assem","r")
      for instruction in file:read("*a"):gmatch("%w+") do
        if error ~= "" then
          break
        end
        if opcode then
          registerOpcode[registerCounter] = decodeOpcode(instruction)
        else
          registerOperand[registerCounter] = tonumber(instruction)
          registerCounter = registerCounter + 1 
        end
        opcode = not opcode
      end
      if not opcode then
        error = "Bad instruction pair["..math.floor(registerCounter).."]"
      end
      file:close()
    end
    
    function cpu()
      if registerOpcode[registerCounter] == 1 then
        
      elseif registerOpcode[registerCounter] == 2 then
        registerA = registerA + registerOperand[registerCounter]
      elseif registerOpcode[registerCounter] == 3 then
        registerA = registerA - registerOperand[registerCounter]
      elseif registerOpcode[registerCounter] == 4 then
        registerA = registerA * registerOperand[registerCounter]
      elseif registerOpcode[registerCounter] == 5 then
        registerA = math.floor( registerA / registerOperand[registerCounter] )
      elseif registerOpcode[registerCounter] == 6 then
        registerCounter = registerOperand[registerCounter] - 1
      elseif registerOpcode[registerCounter] == 7 then
        registerA = registerOperand[registerCounter]
      elseif registerOpcode[registerCounter] == 8 then
        registerB = registerOperand[registerCounter]
      elseif registerOpcode[registerCounter] == 9 then
        registerOpcode[registerOperand[registerCounter]] = registerA
--> This is the line
      elseif registerOpcode[registerCounter] == 10 then
        registerOpcode[registerOperand] = registerB
      else
        error = "Bad register["..i.."]"
      end
      registerCounter = registerCounter + 1
    end
    
    decode()
    
    registerCounter = 1
    
    while error == "" and registerOpcode[registerCounter] ~= nil do
      cpu()
    end
    
    if error == "" then
      for i=1,#registerOpcode do
        print(registerOpcode[i]..","..registerOperand[i])
      end
    end
    
    if error ~= "" then
      print("Error:"..error)
    end
    
    print(registerOpcode[7])
    
    
    os.exit()

我正在尝试分配给表 registerOperand registerOpcode[registerOperand[registerCounter]] = registerA
但是当我尝试分配新键时,它会引发错误,我检查了括号内的每个变量。他们都不是nil。只是索引处的表是nil我试图为其赋值的表,registerA 当我为现有键赋值时,它不会抛出错误。

创建代码 main.assem

LDA 15
STA 3

这将在索引 3 处存储值

我虽然 lua 不支持嵌套方括号或它的错误。但是当我尝试单独模拟类似的环境时,它没有问题。

标签: lua

解决方案


因此,我使用提议的代码运行了您的代码,LDA 15 STA 3这会触发您的错误注册消息。i这会导致 连接全局 nil 值的错误error = "Bad register["..i.."]"

i里面是零cpu()

所以我删除了这个错误并改为第二个建议LDA 5 STA 4

现在我收到以下错误

97: 尝试连接一个 nil 值(字段 '?')

print(registerOpcode[i]..","..registerOperand[i])i存在而导致 3

首先你运行解码它给你

registerOpcode = {7, 9}registerOperand = {5, 4}

7在您分配给的 cpu 的第一次调用中registerA。在您分配registerA给的第二个电话中registerOpcode[4]

所以现在registerOpCode = {7, 9, nil, 4}

然后你在 registerOpcode 上运行一个数字 for 循环,它的索引registerOpcode[3]nil.

我不知道您如何以及在何处遇到引用的错误

错误:尝试对 nil 值(字段“?”)执行算术运算

但这不是由您提供的代码/输入引起的。提到的行包含一个分配。这不会导致算术运算出错。


推荐阅读