2015-04-04 16 views
7

Tôi muốn tạo hàm Lua mới.mở rộng Lua: kiểm tra số tham số được chuyển đến hàm

Tôi có thể sử dụng chức năng với tham số (Tôi đang theo dõi this link) để đọc các tham số chức năng.

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

Tôi muốn biết nếu có một cách nào để biết số lượng các tham số truyền cho một chức năng, để in một tin nhắn nếu người dùng không gọi hàm với hai tham số.

Tôi muốn thực hiện chức năng khi người dùng viết

idiv(3, 4) 

và in một lỗi khi

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

Thực tiễn thông thường trong Lua không phải là khiếu nại về các đối số bổ sung. – lhf

+0

Và còn ít đối số thì sao? – Jepessen

+1

Ít tranh cãi hơn là một câu chuyện khác. Nếu mặc định hợp lý có thể được sử dụng, sau đó làm điều đó. Nếu không, hãy báo lỗi. – lhf

Trả lời

9

Bạn có thể sử dụng lua_gettop() để xác định số lượng đối số truyền cho một hàm C Lua:

int lua_gettop (lua_State *L);
Trả về chỉ mục của phần tử trên cùng trong ngăn xếp. Vì các chỉ số bắt đầu ở mức 1, kết quả này bằng với số phần tử trong ngăn xếp (và vì vậy 0 có nghĩa là một ngăn xếp trống).

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

Cảm ơn. Đó chính xác là những gì tôi cần! – Jepessen

Các vấn đề liên quan