2015-04-04 11 views
7

Chcę utworzyć nową funkcję Lua.rozszerzenie Lua: sprawdź liczbę parametrów przekazanych do funkcji

Mogę użyć funkcji z parametrami (podążam za this link), aby odczytać parametry funkcji.

static int idiv(lua_State *L) { 
    int n1 = lua_tointeger(L, 1); /* first argument */ 
    int n2 = lua_tointeger(L, 2); /* second argument */ 
    int q = n1/n2; int r = n1 % n2; 
    lua_pushinteger(L, q); /* first return value */ 
    lua_pushinteger(L, r); /* second return value */ 
    return 2; /* return two values */ 
} 

Chciałabym wiedzieć, czy istnieje sposób, aby znać liczbę parametrów przekazywanych do funkcji, aby wydrukować wiadomość, jeśli użytkownik nie wywołać funkcję z dwoma parametrami.

Chcę uruchomić funkcję, gdy użytkownik zapisuje

idiv(3, 4) 

i drukować błąd podczas

idiv(2) 
idiv(3,4,5) 
and so on... 
+1

Normalną praktyką w Lua nie ma na co narzekać dodatkowych argumentów. – lhf

+0

A co z mniejszą liczbą argumentów? – Jepessen

+1

Mniejsza liczba argumentów to inna historia. Jeśli można użyć rozsądnych wartości domyślnych, zrób to. W przeciwnym razie zwiększ błąd. – lhf

Odpowiedz

9

Można użyć lua_gettop() dla określenia liczby argumentów przekazanych do funkcji C Lua:

int lua_gettop (lua_State *L);
Powoduje zwrócenie indeksu najwyższego elementu stosu. Ponieważ indeksy zaczynają się od 1, wynik ten jest równy liczbie elementów w stosie (tak więc 0 oznacza pusty stos).

static int idiv(lua_State *L) { 
    if (lua_gettop(L) != 2) { 
    return luaL_error(L, "expecting exactly 2 arguments"); 
    } 
    int n1 = lua_tointeger(L, 1); /* first argument */ 
    int n2 = lua_tointeger(L, 2); /* second argument */ 
    int q = n1/n2; int r = n1 % n2; 
    lua_pushinteger(L, q); /* first return value */ 
    lua_pushinteger(L, r); /* second return value */ 
    return 2; /* return two values */ 
} 
+0

Dzięki. Dokładnie tego potrzebowałem! – Jepessen

Powiązane problemy