Lua a cyklus

Lua a cyklus
« kdy: 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


Re:Lua a cyklus
« Odpověď #1 kdy: 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...

Re:Lua a cyklus
« Odpověď #2 kdy: 23. 02. 2023, 19:56:21 »
Dík, bylo to tou 0.

Re:Lua a cyklus
« Odpověď #3 kdy: 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 :)

Re:Lua a cyklus
« Odpověď #4 kdy: 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/


Re:Lua a cyklus
« Odpověď #5 kdy: 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/

Re:Lua a cyklus
« Odpověď #6 kdy: 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.

Ink

  • *****
  • 658
    • Zobrazit profil
    • E-mail
Re:Lua a cyklus
« Odpověď #7 kdy: 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.  :(

Bugsa

  • ***
  • 113
    • Zobrazit profil
    • E-mail
Re:Lua a cyklus
« Odpověď #8 kdy: 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

Re:Lua a cyklus
« Odpověď #9 kdy: 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

Ink

  • *****
  • 658
    • Zobrazit profil
    • E-mail
Re:Lua a cyklus
« Odpověď #10 kdy: 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"?

Re:Lua a cyklus
« Odpověď #11 kdy: 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.

« Poslední změna: 24. 02. 2023, 13:08:23 od _Tomáš_ »

Ink

  • *****
  • 658
    • Zobrazit profil
    • E-mail
Re:Lua a cyklus
« Odpověď #12 kdy: 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í.