Lua脚本报错:attempt to perform arithmetic on a nil value 求助
解决Speedhack Lua脚本的nil值算术错误问题
问题根源
你犯了两个关键错误:
- 错误的比较运算符:Lua里判断“不等于”的正确写法是
~=,你写成了~-——这个语法会被Lua解析成「按位取反后做减法」,完全不是你想要的非空判断逻辑,导致条件判断失效。 - 未检查读取结果:即使
[_speed]指针有效,readFloat也可能因内存权限、偏移错误等原因返回nil,直接做乘法运算就会触发attempt to perform arithmetic on a nil value错误。
修正后的代码
function Speedhack1() local boost = 1.5 -- 用local声明避免全局变量污染 local speedPtr = readBytes('[_speed]') if speedPtr ~= nil then local valDC = readFloat('[_speed]+DC') local valE0 = readFloat('[_speed]+E0') local valE4 = readFloat('[_speed]+E4') -- 检查每个读取值非空后再写入 if valDC ~= nil then writeFloat ('[_speed]+DC', valDC * boost) end if valE0 ~= nil then writeFloat ('[_speed]+E0', valE0 * boost) end if valE4 ~= nil then writeFloat ('[_speed]+E4', valE4 * boost) end end end createHotkey(Speedhack1, VK_UP) function Speedhack2() local boost = 0.5 local speedPtr = readBytes('[_speed]') if speedPtr ~= nil then local valDC = readFloat('[_speed]+DC') local valE0 = readFloat('[_speed]+E0') local valE4 = readFloat('[_speed]+E4') if valDC ~= nil then writeFloat ('[_speed]+DC', valDC * boost) end if valE0 ~= nil then writeFloat ('[_speed]+E0', valE0 * boost) end if valE4 ~= nil then writeFloat ('[_speed]+E4', valE4 * boost) end end end createHotkey(Speedhack2, VK_DOWN)
关键修正点说明
- 把所有
~-替换为Lua标准的不等于运算符~=,确保非空判断逻辑生效。 - 用
local声明boost和读取的临时变量,避免全局变量冲突。 - 对每个
readFloat的返回值单独做非空检查,彻底避免nil值算术错误。 - 提前把
readBytes('[_speed]')存入变量,避免重复读取指针,提升效率。
内容的提问来源于stack exchange,提问作者William Wolfrom
相关产品推荐
相关产品推荐

