2013-12-10 20 views
5

Tôi có các ví dụ về google cao và thấp và được tìm thấy, nhưng không có ví dụ nào trong số đó có vẻ hoạt động (Lua 5.2).Gọi hàm Lua từ C++

Tôi có một chức năng đơn giản trong Lua

function onData (data) 
    print (data) 
end 

Tôi muốn gọi onData từ C++ và cố gắng này:

// Create new Lua state 
L = luaL_newstate(); 

// Load all Lua libraries 
luaL_openlibs(L); 

// Create co-routine 
CO = lua_newthread(L); 

// Load and compile script 
AnsiString script(Frame->Script_Edit->Text); 
if (luaL_loadbuffer(CO,script.c_str(),script.Length(),AnsiString(Name).c_str()) == LUA_OK) { 
    Compiled = true; 
} else { 
    cs_error(CO, "Compiler error: "); // Print compiler error 
    Compiled = false; 
} 


// Script compiled and ready? 
if (Compiled == true) { 
    lua_getglobal(CO, "onData"); // <-------- Doesn't find the function 
    if(!lua_isfunction(CO,-1)) { 
    lua_pop(CO,1); 
    return; 
    } 
    lua_pushlstring(CO,data,len); 
    lua_resume(CO,NULL,0) 
} 

Như bạn có thể thấy tôi bắt đầu kịch bản của tôi như là một đồng thường xuyên để tôi có thể sử dụng chức năng lua_yield() trên đó. Tôi đã cố tìm kiếm hàm ở cả hai trạng thái LCO.

Trả lời

4

luaL_loadbuffer tải tập lệnh nhưng không chạy tập lệnh đó. onData sẽ chỉ được xác định khi tập lệnh được chạy.

Hãy thử gọi luaL_dostring thay vì luaL_loadbuffer.

Hoặc thêm lua_pcall(CO,0,0,0) trước lua_getglobal.

Ngoài ra, bạn cần lua_resume(CO,NULL,1) để chuyển data đến onData.

+0

Nhưng lua_loadbuffer() biên dịch tập lệnh và đặt nó trên ngăn xếp để thực thi, vì vậy cần biết. luaL_dostring() sẽ biên dịch và thực thi kịch bản lệnh, sau đó đoạn đó được bật lên trong ngăn xếp. Như bạn có thể thấy tôi cần sử dụng lua_resume để tôi có thể sử dụng hàm lua_yield(). Nếu tôi chạy tập lệnh đầu tiên, thì mã khác ngoài hàm mong muốn cũng sẽ chạy. Tôi chỉ muốn chạy hàm đó, không có gì khác. –

+2

@MaxKielland lhf là một trong những người sáng tạo của Lua. Anh ta có thể biết rất rõ điều anh ta đang nói. Vì vậy, tôi đề nghị thực sự cố gắng đề xuất của mình và xem nếu nó hoạt động (vì nó có thể sẽ). –

+0

@MaxKielland, nếu bạn muốn xác định 'onData', bạn cần chạy tập lệnh. Ngoài ra, bạn cần 'lua_resume (CO, NULL, 1)' để chuyển 'dữ liệu' sang' onData'. – lhf