2011-06-22 40 views
7

Tôi muốn để xử lý các đoạn mã sau trong Lua và C:Calling Lua chức năng

Hãy nói rằng tôi có C hàm có tên Foo đó là ràng buộc để Lua. Tôi gọi nó như sau trong Lua script:

Foo(15, "bar", function(z) return 2 * z + 1 end) 

Ở phía C, tôi lấy các đối số và tôi có thể lưu trữ số và chuỗi trong cấu trúc của mình. Nhưng tôi cần loại dữ liệu nào để lưu trữ chức năng ẩn danh? Và làm thế nào tôi có thể gọi nó sau này?

Trả lời

4

Bạn có thể để chức năng ở nơi nào đó trong ngăn xếp hoặc lưu nó trong sổ đăng ký hoặc một số bảng khác với luaL_ref.

6

Bạn không thể lưu trữ một hàm Lua như một C kiểu dữ liệu, ngoài bạn có thể lưu trữ một bảng Lua dưới dạng kiểu dữ liệu C.

Những gì bạn có thể làm là sử dụng the registry để lưu trữ giá trị này. Cơ quan đăng ký là một bảng có sẵn trên toàn cầu cho tất cả người dùng C để lưu trữ dữ liệu. Bạn nên chọn một khóa duy nhất cho tất cả mã của bạn và đặt một bảng tại khóa đó. Bảng này sẽ chứa các giá trị bạn muốn giữ lại. Điều này sẽ giúp giảm xung đột từ mã C khác bằng cách sử dụng sổ đăng ký.

4

Nói chung, bạn không lưu trữ hàm trong biến C. Bạn để nó trên ngăn xếp và gọi nó với pcall(). Một cái gì đó như:

int l_Foo(lua_State *L) 
{ 
    lua_pop(L, 2);   /* ignore the first two args */ 
         /* (the function is now on top of the stack) */ 
    lua_pushnumber(L, 2); /* push the number to pass as z */ 
    lua_pcall(L, 1, 1, 0); /* call the function with 1 argument, expect 1 result */ 
    lua_pop(L, 1);   /* ignore the result */ 
} 

tôi đã rời ra một số lỗi kiểm tra vì lợi ích ngắn gọn, nhưng thấy Programming in Lua cho một ví dụ hoàn chỉnh hơn và the Lua Reference Manual để biết thêm chi tiết về các chức năng.

0

Một cách sẽ được làm công việc của chức năng ẩn danh ở phía lua và vượt qua là kết quả của chức năng để FOO(int, char*, fun_result_type fun_result)

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