2013-05-06 20 views
5

Tôi sẽ viết chương trình bằng cách sử dụng AI, vì vậy tôi đang cố gắng làm cho nó hoạt động cùng nhau. Nhưng khi tôi cố gắng tải một script lua từ tập tin cpp của tôi, tôi đã có thông báo lỗi này:Kịch bản lệnh Lua với C++: cố gắng lập chỉ mục toàn cầu 'io' (giá trị 0il)

-- toto.lua:1: attempt to index global 'io' (a nil value) 

Đây là kịch bản lua tôi:

io.write("Running ", _VERSION, "\n")

Và đây là tập tin cpp của tôi :

void report_errors(lua_State *L, int status) 
{ 
    if (status!=0) { 
    std::cerr << "-- " << lua_tostring(L, -1) << std::endl; 
    lua_pop(L, 1); // remove error message                
    } 
} 



int main(int argc, char** argv) 
{ 
    for (int n=1; n<argc; ++n) { 
    const char* file = argv[n]; 

    lua_State *L = luaL_newstate(); 

    luaopen_io(L); // provides io.*                 
    luaopen_base(L); 
    luaopen_table(L); 
    luaopen_string(L); 
    luaopen_math(L); 

    std::cerr << "-- Loading file: " << file << std::endl; 

    int s = luaL_loadfile(L, file); 

    if (s==0) { 
    s = lua_pcall(L, 0, LUA_MULTRET, 0); 
    } 

    report_errors(L, s); 
    lua_close(L); 
    std::cerr << std::endl; 
    } 
    return 0; 
    } 

Cảm ơn rất nhiều.

+0

Mã tạo trạng thái Lua riêng cho mỗi tệp mà nó chạy. Điều này sẽ ngăn các tệp khác nhau giao tiếp. Điều này có thể không phải là những gì bạn muốn. – lhf

Trả lời

4

Bạn không nên gọi trực tiếp các chức năng luaopen_ *. Sử dụng một trong hai luaL_openlibs hoặc luaL_requiref thay vì:

luaL_requiref(L, "io", luaopen_io, 1); 

Các vấn đề cụ thể ở đây là luaopen_io không lưu trữ bảng mô-đun trong _G, vì thế mà khiếu nại rằng io là một giá trị nil. Hãy xem mã nguồn cho luaL_requiref trong lauxlib.c nếu bạn muốn biết các chi tiết đẫm máu.

+0

Cảm ơn, nó hoạt động tốt ngay bây giờ, tôi sử dụng luaL_openlibs thay thế. Tôi sẽ ghi nhớ lời khuyên của bạn! – BoilingLime

+0

Nó giúp. Bạn có thể vui lòng giải thích tại sao luaopen_ * không hoạt động? Đây là điều đầu tiên bạn nhìn thấy trong tài liệu của họ –

+0

@VladLazarenko Các hàm luaopen_ * chỉ đơn giản là tạo một bảng (chủ yếu chứa các hàm) trên cùng của ngăn xếp. Những gì còn thiếu là liên kết bảng đó với một tên để nó có thể được truy cập từ bên trong Lua và đăng ký nó với cơ chế tải mô-đun. Tuy nhiên, hai bước này giống nhau cho tất cả các thư viện. Hãy suy nghĩ về hàm luaopen_ * như những gì người viết thư viện cung cấp để thiết lập thư viện cụ thể đó. Mục tiêu của nó không phải là làm tải thư viện đầy đủ mà là cung cấp thông tin mà luaL_requiref cần thực hiện việc tải thay thế. – ComicSansMS

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