【问题标题】:Multi-dimentional tables in Lua [duplicate]Lua中的多维表[重复]
【发布时间】:2021-07-03 17:07:33
【问题描述】:

我是 Lua 的新手,我正在尝试创建一个小应用程序来读取 adc 值。这里的重点是我正在尝试使用以下代码将值从一个表分配给另一个表,但它确实不起作用(没有错误,只是什么都不做):

-- Setting output GPIO pins
multip = {  sc0 = 0,  sc1 = 3,  sc2 = 4 }
for k3,v3 in pairs(multip) do gpio.mode(v3, gpio.OUTPUT) end

-- Assigning ADC channels
HIHs = {
        hum1 = {
                sc0 = gpio.HIGH,
                sc1 = gpio.LOW,
                sc2 = gpio.HIGH
        },
        hum2 = {
                sc0 = gpio.LOW,
                sc1 = gpio.HIGH,
                sc2 = gpio.HIGH
        },
        hum3 = {
                sc0 = gpio.HIGH,
                sc1 = gpio.HIGH,
                sc2 = gpio.HIGH
        }
}

-- Sequentially access each channel and read value
for g,t in pairs(HIHs) do
    print("---------- Setting Humidity sensor " .. g .. " ----------")
    for k4,v4 in pairs(multip) do 
        print("Writing pin " .. k4 .. " to " .. tostring(t[k4]))
        gpio.write(v4, t[k4])   
    end
    print("ADC Value: "..adc.read(0))
end

非常奇怪的是,如果我这样做了:

for k1,v1 in pairs(HIHs) do for k2,v2 in pairs(v1) do print(k1,k2,v2) end end

我什至没有按正确的顺序获取 HIHs 表,它从第二个元素开始打印:

hum2    sc0 0
hum2    sc1 1
hum2    sc2 1
hum3    sc0 1
hum3    sc1 1
hum3    sc2 1
hum1    sc0 1
hum1    sc1 0
hum1    sc2 1

这段代码有什么问题?为什么我不能访问我的表格并且不应该按顺序打印它?除非我在 Lua 理解中明显遗漏了一些非常非常基本的东西......

感谢您的帮助.... :)

【问题讨论】:

  • 排序是正常的,Lua 表是无序的,所以任何有序数据的出现都是巧合。也不做ipairs(HIHs)pairs(HIHs)
  • 是的,谢谢它解释了为什么我得到的数据不是我期望的顺序。抱歉 ipairs 只是一个错字,我实际上使用了pairs。

标签: arrays multidimensional-array lua


【解决方案1】:

请注意,我不知道您申请的详细信息(如果您的方法正确的话),所以我提供的是一般性建议。

代替:

-- Setting output GPIO pins
multip = {  sc0 = 0,  sc1 = 3,  sc2 = 4 }
for k3,v3 in pairs(multip) do gpio.mode(v3, gpio.OUTPUT) end

你可以使用:

-- Setting output GPIO pins
multip = {{"sc0",0},{"sc1",3},{"sc2",4}}
for k,v in ipairs(multip) do gpio.mode(v[2], gpio.OUTPUT) end

代替:

-- Assigning ADC channels
HIHs = {
        hum1 = {
                sc0 = gpio.HIGH,
                sc1 = gpio.LOW,
                sc2 = gpio.HIGH
        },
        hum2 = {
                sc0 = gpio.LOW,
                sc1 = gpio.HIGH,
                sc2 = gpio.HIGH
        },
        hum3 = {
                sc0 = gpio.HIGH,
                sc1 = gpio.HIGH,
                sc2 = gpio.HIGH
        }
}

你可能想这样做:

HIHs = {}
-- hum1
HIHs[1] = {}
HIHs[1][1] = gpio.HIGH
HIHs[1][2] = gpio.LOW
HIHs[1][3] = gpio.HIGH
-- hum2
HIHs[2] = {}
HIHs[2][1] = gpio.HIGH
HIHs[2][2] = gpio.LOW
HIHs[2][3] = gpio.HIGH
-- hum3
HIHs[3] = {}
HIHs[3][1] = gpio.HIGH
HIHs[3][2] = gpio.LOW
HIHs[3][3] = gpio.HIGH

通过这种方式,您可以轻松地迭代选定的订单:

-- For each HIH
for iHIH=1,#HIHs do
    -- For each sc
    for iSC=1,#HIHs[iHIH] do
        local pin = multip[iSC][2]
        local state = HIH[iHIH][iSC]
        print("Writing pin " .. tostring(pin) .. " to " .. tostring(state))
        gpio.write(pin, state)
    end
end

顺序应该是:

hum1    sc0
hum1    sc1
...
hum3    sc0
hum3    sc2
hum3    sc3

【讨论】:

  • 您的答案不清楚他们的原始代码到底有什么问题。你应该解释为什么,他们想要做你建议的事情,而不是他们以前做的事情。
  • 我有点明白为什么我的代码现在不能正常工作了:当键是字符串时,Lua 会希望我使用双引号内的键值来调用表元素。在我的代码中,通过使用t[k4]k4 是一个字符串,但不在双引号中,因此返回值为 nil。但问题仍然存在:如果我将 t[k4] 替换为 t[string.format("\"%s\"", k4)] 不应该工作吗?
  • @LuminociterFos t[k4] 非常好。您的代码的唯一问题是您希望表格有一个订单,除非您使用数字键,否则情况并非如此。
  • @LuminociterFos 我已经编辑过,看看现在是否更有意义。可惜我没有对你的申请细节做出判断。
  • @Real 您不建议在此处使用pairs,因为未指定遍历顺序。它会经常工作,但它不安全。使用 ipairs 或数字 for 循环。
猜你喜欢
  • 2017-05-10
  • 2011-08-07
  • 2017-12-08
  • 1970-01-01
  • 2014-02-09
  • 2012-07-30
  • 2012-07-13
  • 2023-03-08
  • 2014-10-13
相关资源
最近更新 更多