lua - 错误:在为表赋值时尝试对 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 不支持嵌套方括号或它的错误。但是当我尝试单独模拟类似的环境时,它没有问题。
解决方案
因此,我使用提议的代码运行了您的代码,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 值(字段“?”)执行算术运算
但这不是由您提供的代码/输入引起的。提到的行包含一个分配。这不会导致算术运算出错。
推荐阅读
- java - PDFBox renderImageWithDPI 有时会挂起
- python - Django:表单集 CBV 上的 save(commit=False) 正在触发自定义模型 save() 操作
- python - Django:“产品匹配查询不存在。”?
- javascript - 试图实现 angularJs $uibModal 但它没有弹出。给出错误 angular.min.js:129 可能未处理的拒绝:背景点击
- visual-studio - Visual Studio 资源编辑器 ActiveX 控件...在我刚刚使用资源编辑器添加后无法实例化?
- c++ - 如何使用 CGAL 获得多面体的中轴?
- flutter - Flutter 前一个 DropDownFormField 有数据后如何创建 DropDownFormField
- excel - 如何在不到一分钟的时间内从网络上进行电源查询刷新数据?
- ubuntu - 终端 Linux Ubuntu
- php - CURLOPT_URL 带下划线,怎么做?