【问题标题】:loop through Array and perform arithmetic on nil value in Lua遍历 Array 并对 Lua 中的 nil 值执行算术运算
【发布时间】:2018-06-22 10:07:16
【问题描述】:

我对 lua 还很陌生,并且已经盯着 lua 搞砸了。我编写了以下脚本,在数组的帮助下打印出我与构造函数中每个可用对象的距离和角度,但我的方式存在一个大问题:

me = {'["game.exe"+2A]','["game.exe"+A8]','["game"+6A8]'}

botallx = {'["game.exe"+01]','["game.exe"+02]','["game.exe"+03]',
'["game.exe"+04]','["game.exe"+05]','["game.exe"+06]','["game.exe"+07]',
'["game.exe"+08]','["game.exe"+09]','["game.exe"+10]','["game.exe"+11]',
'["game.exe"+12]'}

botally = {'["game.exe"+31]','["game.exe"+32]','["game.exe"+33]',
'["game.exe"+34]','["game.exe"+35]','["game.exe"+36]','["game.exe"+37]',
'["game.exe"+38]','["game.exe"+39]','["game.exe"+30]','["game.exe"+31]',
'["game.exe"+32]'}

botallz = {'["game.exe"+51]','["game.exe"+52]','["game.exe"+53]',
'["game.exe"+54]','["game.exe"+55]','["game.exe"+56]','["game.exe"+57]',
'["game.exe"+58]','["game.exe"+59]','["game.exe"+50]','["game.exe"+51]',
'["game.exe"+52]'}

function sight_angle()
     if (isKeyPressed(VK_E)) then

     for i=1, 12 do
     if (botallx[i] ~= nil or botally[i] ~= nil or botallz[i] ~= nil ) then
     vecX=readFloat(me[1])-readFloat(botallx[i])
     vecY=readFloat(me[2])-readFloat(botally[i])
     vecZ=readFloat(me[3])-readFloat(botallz[i])

     distance=math.sqrt(math.pow(calcZ,2)+math.pow(calcX,2))

     angleX=math.deg(math.atan2(calcZ, calcX))

     print ("current distance is " .. distance)
     print ("current angle is " .. angleX)
     else --One of the botallx, botally, botallz value was nil
     print ("Can't perform calculations due to a nil value")
     end
     end
end

这些名为 ["game.exe"+...] 的地址包含一个浮点值,但 botally、botallx 和 botallz 容器中的某些对象为 nil 或具有 nil 值。因此,当我执行脚本时,i=1 到 12 的数组开始计算第一个并给我角度和距离,但一直计算直到它从容器中遇到一个具有 nil 值的对象然后不想要继续计算其他对象。

示例:botally 中的对象 1,3,6,botallx 和 botallz 都有值,其他的都是 nil。 它开始计算第一个...给出距离和角度,然后在第二个停止并开始抱怨由于 nil 值而无法执行计算,所以它跳回到第一个对象并给我再看看它的距离和角度。

但我希望它跳过第二个空的 nil 对象并继续处理第三个对象,它有一个值并为我打印距离和角度,然后跳过空的第 4 和第 5 个并计算第 6 个和之后,它可以再次跳回第一个,因为从 7 到 12 的其余部分为零。

但它不想这样做....有人可以帮助我吗?

【问题讨论】:

  • 目前,您的表格结构似乎存在问题。检查你的单引号 ('),因为有一些不匹配的。您在此处显示脚本的方式(忽略构造错误),您的表中没有 nil 值。
  • 那么还有一种强烈的感觉,就是你应该这样做不同。您说您的表中有浮点值(即数字),但您决定使用字符串来存储这些值。这看起来很奇怪。
  • 哦,我明白了,我修复了单引号。表中的这些字符串实际上是指向包含浮点值的特定地址的指针地址。
  • 你是否使用嵌入的lua,比如c++?在纯lua中,没有指针,那么你到底在做什么?即使您需要指针地址的偏移量,将它们存储为数字而不是字符串仍然会更容易。也许你可以展示一些代码。你从哪里得到偏移量?顺便说一句,您还没有修复单引号,请查看语法突出显示。表格下方的代码是红色的(这是一个字符串)。
  • 对不起,我再次检查了它......现在它应该用引号修复。我使用嵌入在名为 Cheat Engine 的程序中的 LUA 来使用指针。我想打印出我与游戏中显示的所有当前机器人的距离和角度

标签: arrays math lua null


【解决方案1】:

一般来说,在lua中,你应该使用~= nil来检查一个值是否为`nil。所以你可以像这样修改你的代码:

  for i=1, 12 do
    --Do the following calculations only if botallx or botally or botallz        
    -- are not nil
    if (botallx[i] ~= nil or botally[i] ~= nil or botallz[i] ~= nil ) then
       vecX=readFloat(me[1])-readFloat(botallx[i])
       vecY=readFloat(me[2])-readFloat(botally[i])
       vecZ=readFloat(me[3])-readFloat(botallz[i])

       distance=math.sqrt(math.pow(calcZ,2)+math.pow(calcX,2))

       angleX=math.deg(math.atan2(calcZ, calcX))

       print ("current distance is " .. distance)
       print ("current angle is " .. angleX)
    else --One of the botallx, botally, botallz value was nil
       print ("Can't perform calculations due to a nil value")
 end

或者上面的if语句也可以这样写:

if (botallx[i] not nil or botally[i] not nil or botallz[i] not nil )

【讨论】:

  • 谢谢你的回答,不知怎的,它并没有改变任何东西......脚本的行为仍然和以前一样。
  • 它在达到 nil 值时停止计算并且不打印出其他计算对象。 for i=1, 12 do --obj 1 is nil, obj 2,3,4 not nil, obj 5-12 is nil, 它打印错误 Error:[string "me = {'["game.exe"+ 01"]:46: 尝试对 nil 值执行算术运算,只有当我从开始时有值的点更改数组时,它才会继续给出答案。 for i=2, 12 do --obj 1 is nil, obj 2,3,4 not nil, obj 5-12 is nil 它会打印答案
  • 您发布的代码与我的答案中的代码不同。您不是在检查是否所有对象都不是 nil,而是仅在对象 2、3、4 不是 nil 的情况下检查。因此,如果 obj1 为 nil,代码流将在 if 的主体中继续,因此它会尝试“对 nil 值执行算术运算”(obj1)。
  • 我没有编辑发布在这里的代码...没错,但我在 LUA 中更改了我的代码。我仍然有和以前一样的问题
  • 好吧,现在变得很奇怪....当我将“i=1, 12 do”的计数器更改为“i=0, 12 do”时,我现在收到错误消息(“Can '不执行计算由于零值") 为 0 对象,以及错误错误:[string "me = {'["game.exe"+01"]:46:尝试对 nil 值执行算术第一个 obj 为 nil
【解决方案2】:

我想你在这里想要and 而不是or。使用or,您正在检查其中至少一个存在,然后使用不存在的那些。

if (botallx[i] ~= nil and botally[i] ~= nil and botallz[i] ~= nil ) then

或者:

if botallx[i] and botally[i] and botallz[i] then

尽管那些botall 地址在您设置表格的方式中总是非零。

calcXcalcZ 是什么? 你的意思是 vecXvecZ 吗? 如果是这样,那是你的 nil 算术异常。如果您不知道,未声明的变量具有 nil 值,而不是像大多数其他语言那样导致“未知符号”错误。

假设calcX 问题只是一个复制/粘贴错误,您可能需要对这些readFloat(...) 调用进行一些零检查。

function sight_angle()
    if (isKeyPressed(VK_E)) then
        local meX = readFloat(me[1])
        local meY = readFloat(me[2])
        local meZ = readFloat(me[3])
        if not meX or not meY or not meZ then
            print ("Can't perform calculations due to a nil value")
            return
        end
        for i=1, 12 do
            -- Ditch the botall nil checks
            local bX = readFloat(botallx[i])
            local bY = readFloat(botally[i])
            local bZ = readFloat(botallz[i])
            
            if bX and bY and bZ then   
                local vecX=meX-bX
                local vecY=meY-bY
                local vecZ=meZ-bZ

                -- Assuming calcX and calcZ meant vecX and vecZ
                local distance=math.sqrt(math.pow(vecZ,2)+math.pow(vecX,2))

                local angleX=math.deg(math.atan2(vecZ, vecX))

                print ("current distance is " .. distance)
                print ("current angle is " .. angleX)
            else
                print ("Can't perform calculations due to a nil value")
            end
        end
    end
end

当然,我完全不知道这些东西是做什么的!这是一个作弊引擎插件吗?我只是基于我在您的代码 sn-p 中看到的内容。

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2020-08-22
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2017-01-10
    相关资源
    最近更新 更多