Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: doga312 23. 02. 2023, 12:17:32

Název: Lua a cyklus
Přispěvatel: doga312 23. 02. 2023, 12:17:32
Ahoj,
předělávám si z BASHe do Lua zobrazování počasí a nedaří se mi rozchodit cyklus for:
Kód: [Vybrat]
#!/usr/bin/lua5.3

lunajson = require 'lunajson'

-- read local file
local open = io.open
local file = open("/home/doga/.conky/pocasi/compact.json")
if not file then return nil end
local jsonString = file:read "*a"
file:close()
local table = lunajson.decode(jsonString)

print(table.properties.timeseries[1].data.instant.details.air_temperature)
print(table.properties.timeseries[2].data.instant.details.air_temperature)

 local teplota = {}
for t = 0,5 do
   teplota[t] = table.properties.timeseries[t].data.instant.details.air_temperature
  print(teplota[t])
end
hází to chybu:
Kód: [Vybrat]
5.5
6.3
/usr/bin/lua5.3: ./json9.lua:19: attempt to index a nil value (field '?')
stack traceback:
./json9.lua:19: in main chunk
[C]: in ?
Dík za pomoc
Název: Re:Lua a cyklus
Přispěvatel: Exceptions 23. 02. 2023, 13:29:24
a víš, že lua indexuje pole od 1? asi by mělo být "for t=1,6".

Ta chybová hláška ti jasně říká, že index t není v poli nalezený, tj. nemáš správně ošetřený přístup k poli, to je asi hlavní příčina chyby. Netuším jaká máš  vstupní data...
Název: Re:Lua a cyklus
Přispěvatel: doga312 23. 02. 2023, 19:56:21
Dík, bylo to tou 0.
Název: Re:Lua a cyklus
Přispěvatel: Wasper 23. 02. 2023, 22:36:24
BTW když už tu je tolik odborníků na LUA, nemohl by někdo doporučit z toho milionu co jsou na netu k dispozici nějaký rozumný quick tutorial? To znamená žádné rozvláčné rozepisování (už vůbec ne video), ale základní principy jazyka, datové typy (třeba jako to jak tu padlo že pole jsou od jedné) a pár triviálních příkladů atd.
...zhruba ve formátu, jak tu pan Tišnovský občas popisuje různé exotické jazyky :)
Název: Re:Lua a cyklus
Přispěvatel: Pavel Stěhule 24. 02. 2023, 06:57:19
BTW když už tu je tolik odborníků na LUA, nemohl by někdo doporučit z toho milionu co jsou na netu k dispozici nějaký rozumný quick tutorial? To znamená žádné rozvláčné rozepisování (už vůbec ne video), ale základní principy jazyka, datové typy (třeba jako to jak tu padlo že pole jsou od jedné) a pár triviálních příkladů atd.
...zhruba ve formátu, jak tu pan Tišnovský občas popisuje různé exotické jazyky :)

viz https://www.root.cz/clanky/programovaci-jazyk-lua/
Název: Re:Lua a cyklus
Přispěvatel: jb101 24. 02. 2023, 07:00:51
BTW když už tu je tolik odborníků na LUA, nemohl by někdo doporučit z toho milionu co jsou na netu k dispozici nějaký rozumný quick tutorial? To znamená žádné rozvláčné rozepisování (už vůbec ne video), ale základní principy jazyka, datové typy (třeba jako to jak tu padlo že pole jsou od jedné) a pár triviálních příkladů atd.
...zhruba ve formátu, jak tu pan Tišnovský občas popisuje různé exotické jazyky :)
A nebo:
https://learnxinyminutes.com/docs/lua/ (https://learnxinyminutes.com/docs/lua/)
Název: Re:Lua a cyklus
Přispěvatel: Exceptions 24. 02. 2023, 09:40:23
já se nejraději účím ze zdrojáků a testy přímo pro luu samotnou mi příjdou nejlepší https://github.com/lua/lua/tree/master/testes, hlavně vidím jak to autoři zamýšleli, co je pokryté a funguje v pořádku.
Název: Re:Lua a cyklus
Přispěvatel: Ink 24. 02. 2023, 10:47:44
Docela by mě zajímalo, proč interpreter Lua, který je na světě tak dlouho, nedokáže vyplivnout smysluplnou chybovou hlášku pro tak jasný problém.  :(
Název: Re:Lua a cyklus
Přispěvatel: Bugsa 24. 02. 2023, 12:06:07
Inku, co ti je na hlášce
Kód: [Vybrat]
attempt to index a nil value (field '?') nejasného?
Očekáváš snad že ti to napíše že se indexuje od 1? ;D
Název: Re:Lua a cyklus
Přispěvatel: Exceptions 24. 02. 2023, 12:14:11
Docela by mě zajímalo, proč interpreter Lua, který je na světě tak dlouho, nedokáže vyplivnout smysluplnou chybovou hlášku pro tak jasný problém.  :(

chyba "attempt to index a nil value" na řádku 19 mně příjde dostatečně vypovídající. Pokud prvek v poli neexistuje, vrací se nil, chyba odkazuje na to, že se snažím k přistupovat k atributu hodnoty nil.

Jak by podle tebe ta chyba měla znít? Vždyť interpret neví, jestli náhodou tam nedáváš pole, kde máš i prvek s indexem 0
Název: Re:Lua a cyklus
Přispěvatel: Ink 24. 02. 2023, 12:46:20
Inku, co ti je na hlášce
Kód: [Vybrat]
attempt to index a nil value (field '?') nejasného?
Očekáváš snad že ti to napíše že se indexuje od 1? ;D

Ano, může napsat něco jako "Index out of range", co znamená v lidštině "index a nil value"?
Název: Re:Lua a cyklus
Přispěvatel: Exceptions 24. 02. 2023, 13:06:16
jenže lua nevyhazuje chybu "out of rage" při přístupu k neexistujícímu prvku v poli, vrací pouze nil, když prvek neexistuje.

ta část "to index" v chybové hlášce je sloveso, říká, že nemůže přistoupit na nějaký prvek/vlastnost u typu "nil". Text v závorce "field '?'" mi zase říká, že prvek na který přistupuji není explicitně ve výrazu zadaný, ale pochází z proměnné, tady je jen proměnná t, takže viník je nalezen hned.

Když se kouknu do zdrojáku, tak tam je v řětězci několik volání atributů a indexů v poli v rámci výrazu "table.properties.timeseries[t].data.instant.details.air_temperature", jakýkoliv prvek v pořadí může neexistovat a vrátit hodnotu nil, pak bude i následný prvek uveden v chybě jakou hodnota field, programátor by to měl ověřovat a nespoléhat na správnou strukturu.

Lua je takhle navržena, s tímhle design vznikla a takhle funguje tak 30 let.

Název: Re:Lua a cyklus
Přispěvatel: Ink 24. 02. 2023, 18:31:36
jenže lua nevyhazuje chybu "out of rage" při přístupu k neexistujícímu prvku v poli, vrací pouze nil, když prvek neexistuje.

OK, to se asi moc dobře řešit nedá. Dík za vysvětlení.