2015-04-04 8 views
7

Ich möchte eine neue Lua-Funktion erstellen.Lua erweitern: Anzahl der an eine Funktion übergebenen Parameter prüfen

Ich kann Funktion mit Parametern verwenden (ich bin this link), um Funktionsparameter zu lesen.

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

Ich mag gerne wissen, ob es einen Weg gibt, um die Anzahl der Parameter an eine Funktion übergeben wissen, um eine Nachricht zu drucken, wenn der Benutzer mit zwei Parametern nicht-Funktion nicht aufrufen.

Ich möchte die Funktion auszuführen, wenn der Benutzer

idiv(3, 4) 

schreibt und einen Fehler drucken, wenn

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

Die übliche Praxis in Lua geht es nicht um zusätzliche Argumente zu beklagen. – lhf

+0

Und was ist mit weniger Argumente? – Jepessen

+1

Weniger Argumente sind eine andere Geschichte. Wenn vernünftige Standardeinstellungen verwendet werden können, dann tu das. Andernfalls kann ein Fehler auftreten. – lhf

Antwort

9

Sie lua_gettop() zur Bestimmung der Anzahl der übergebenen Argumente an eine C Lua-Funktion verwenden können:

int lua_gettop (lua_State *L);
Gibt den Index des obersten Elements im Stapel zurück. Da Indizes bei 1 beginnen, ist dieses Ergebnis gleich der Anzahl der Elemente im Stack (und 0 bedeutet einen leeren Stack).

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

Danke. Genau das habe ich gebraucht! – Jepessen

Verwandte Themen