2015-04-04 11 views
7

Voglio creare una nuova funzione Lua.estensione Lua: controllare il numero di parametri passati a una funzione

Posso utilizzare la funzione con i parametri (sto seguendo this link) per leggere i parametri di funzione.

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 */ 
} 

Mi piacerebbe sapere se c'è un modo per conoscere il numero di parametri passati ad una funzione, al fine di stampare un messaggio se l'utente non chiama la funzione con due parametri.

voglio eseguire la funzione quando l'utente scrive

idiv(3, 4) 

e stampare un errore quando

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

La pratica usuale in Lua non è per lamentarsi argomenti extra. – lhf

+0

E che dire di meno argomenti? – Jepessen

+1

Meno argomenti è un'altra storia. Se è possibile utilizzare impostazioni predefinite appropriate, farlo. Altrimenti, genera un errore. – lhf

risposta

9

È possibile utilizzare lua_gettop() per determinare il numero di argomenti passati a una funzione C Lua:

int lua_gettop (lua_State *L);
Restituisce l'indice dell'elemento superiore nello stack. Poiché gli indici partono da 1, questo risultato è uguale al numero di elementi nello stack (e quindi 0 significa uno stack vuoto).

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

Grazie. Questo è esattamente ciò di cui avevo bisogno! – Jepessen

Problemi correlati