Sprawdzenie w C, czy tablica Lua posiada dany klucz

lua

(Michał Martusewicz) #1

Jak to zrobić?
Jeżeli klucz nie istnieje w danej tablcy, to tandardowe polecenie

lua_getfield(L, -1, "name_of_key") 

zwraca

PANIC: unprotected error in call to Lua API (attempt to index a nil value)
Przerwane (zrzut pamięci)

Czy jest jakiś sposób obsłużenia tego wyjątku, albo sprawdzenie czy dany klucz ma wartość nil?


(Radosław Miernik) #2

Ten błąd nie oznacza, że tablica nie ma wartości pod danym kluczem (czyli ma nil), ale że chciałeś sprawdzić pole nie tablicy a właśnie nil. W Lua wyglądałoby to tak:

> local t = nil
> local k = 'name_of_key'
> t[k]
stdin:1: attempt to index a nil value (global 't')
stack traceback:
	stdin:1: in main chunk
	[C]: in ?

Co do samego łapania błędów: lua_pcall i lua_pcallk.


(Michał Martusewicz) #3

Kurczę, ale gdybym chciał sprawdzić pole nil, to takie polecenie w przypadku, gdy tablica jednak ma klucz, też powinno rzucić błędem, prawda?
No bo mam taki kod:

lua_getglobal(L, "TOPLOT");
lua_getfield(L, -1, "step") != LUA_TNUMBER

i plik konfiguracyjny Lua:

local  function  myfunction (x)
    return  x*x
end

TOPLOT = {['function']= myfunction , minx=-10, maxx=10, step =0.2}

Teraz chciałbym obsłużyć w jakiś sposób przypadek, gdy step nie jest podany w tej tablicy. Normalnie wszystko działa, ale gdy pole step nie istnieje, to lua_getfield rzuca tym właśnie błędem.


(Radosław Miernik) #4

Nie, nie sprawdzasz pola nil, tylko pole step. Kod, który napisałeś jest poprawny, o ile istnieje global TOPLOT - błąd wskazuje że tak nie jest, bo lua_getfield Ci rzuca błędem, że próbujesz indeksować nil a nie tablicę. Dodaj lua_istable(L, -1) (i odpowiednio obsłuż) za lua_getglobal, żeby mieć pewność, że taki jest.


(Michał Martusewicz) #5

Mam tak, zrobiłem skrót kodu dla czytelności.
Możesz zobaczyć pełny kod tutaj: