2009-08-01 29 views
9

Bất cứ ai có thể nói với tôi rằng làm thế nào để sử dụng hàm lua_pop() một cách chính xác trong C++.Làm thế nào để sử dụng hàm lua_pop() một cách chính xác?

  • Tôi có nên gọi nó khi tôi sử dụng hàm lua_get *() không? như.

    lua_getglobal (L, "cái gì đó");

    lua_pop (L, 1);

hoặc cách sử dụng? Bộ thu gom rác có xóa những thứ đó sau ngưỡng không? Cảm ơn.

Trả lời

20

Bạn gọi lua_pop() để xóa các mục khỏi ngăn xếp Lua. Đối với các hàm đơn giản, điều này có thể hoàn toàn không cần thiết vì lõi sẽ dọn sạch ngăn xếp như là một phần của việc xử lý các giá trị trả về.

Đối với các chức năng phức tạp hơn, và đặc biệt đối với mã C đang gọi vào Lua, bạn thường cần bật những thứ từ ngăn xếp để ngăn không cho ngăn xếp phát triển vô thời hạn.

Chức năng lua_getglobal() thêm một mục vào ngăn xếp khi được gọi, là nil nếu toàn cầu không tồn tại hoặc giá trị của biến toàn cục có tên. Có một bản sao của giá trị đó trên ngăn xếp bảo vệ nó khỏi bộ thu gom rác miễn là nó ở đó. Giá trị đó cần phải vẫn còn trên ngăn xếp miễn là nó được sử dụng bởi mã C lấy ra nó, bởi vì nếu toàn cầu đã được sửa đổi, bản sao trên ngăn xếp có thể là tham chiếu còn lại duy nhất.

Vì vậy, các mô hình chung cho việc sử dụng một toàn cầu là một cái gì đó như thế này:

void doMyEvent(lua_State *L) { 
    lua_getglobal(L, "MyEvent"); 
    lua_call(L, 0, 0); /* pops the function and 0 parameters, pushes 0 results */ 
} 

double getGlobalDouble(lua_State *L, const char *name) { 
    double d; 
    lua_getglobal(L,name); 
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */ 
    lua_pop(L,1);   /* pop the value to leave stack balanced */ 
    return d; 
} 

char *copyGlobalString(lua_State *L, const char *name) { 
    char *s = NULL; 
    lua_getglobal(L,name); 
    if (!lua_isnil(L,-1)) 
     s = strdup(lua_tostring(L,-1)); 
    lua_pop(L,1); 
    return s; 
} 

Trong ví dụ cuối cùng, tôi cẩn thận để sao chép nội dung của chuỗi vì con trỏ trả về bởi lua_tostring() chỉ đảm bảo được hợp lệ miễn là giá trị vẫn còn trên ngăn xếp. Yêu cầu người gọi copyGlobalString() chịu trách nhiệm gọi free() sau.

Lưu ý rằng các phiên bản gần đây của Lua manual bao gồm ký hiệu cùng với mỗi chức năng xác định số lượng mục nhập ngăn xếp được tiêu thụ và số được đẩy. Điều này giúp tránh sự tăng trưởng không mong muốn.

+0

+1, kiểu nhận xét của Lua trong mã C++? :-) –

+1

@nick ... facepalm! Nó tốt hơn bây giờ ;-) – RBerteig

+0

Hey! Cảm ơn đã giúp đỡ. Và một câu hỏi nữa, sự khác biệt giữa việc gọi lua_call (L, 0, 0) là gì; và lua_pop (L, 1); để loại bỏ các CHỨC NĂNG ?? Tôi có nghĩa là tại sao bạn sử dụng lua_call (L, 0, 0) thay vì sử dụng lua_pop (L, 1)? – Morpheus

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