2015-05-18 12 views
7

Tôi đang sử dụng Lua làm ngôn ngữ kịch bản trong trò chơi (C++) của tôi. Trong một cuộc gọi (từ lua C++) tôi kiểm tra những gì loại là trên đỉnh của ngăn xếp:Trong C++ được gọi từ Lua, lua_type (L, 0) trả về 9 mà không được ghi lại

if(lua_type(L, (0)) == LUA_TSTRING) 

Nhưng đôi khi lua_type (L, (0)) trả 9.

tôi không thể dường như tìm bất kỳ tham chiếu nào đến điều này (giá trị trả về phải nằm trong khoảng từ -1 đến 8 hoặc LUA_TNONE, LUA_TNIL, ... LUA_TTHREAD).

Điều gì đang xảy ra?

+0

Ive tìm thấy sau trong lobject.h: '/ * thẻ tắm ** cho phi giá trị */ #define LUA_TPROTO \t LUA_NUMTAGS #define LUA_TUPVAL \t (LUA_NUMTAGS + 1) #define LUA_TDEADKEY \t (LUA_NUMTAGS + 2) ' đâu 'LUA_NUMTAGS' là 9 –

Trả lời

5

Phía trên cùng của ngăn xếp là chỉ số -1, không 0.

0 bao giờ có thể được sử dụng như một chỉ số để truy cập vào stack:

(Lưu ý rằng 0 là bao giờ là một chỉ số có thể chấp nhận .)

trong §4.3 – Valid and Acceptable Indices trong sách hướng dẫn tham khảo.

API C trong Lua không nắm tay của lập trình viên:

Như trong hầu hết các thư viện C, các chức năng Lua API không kiểm tra lập luận của họ cho hiệu lực hoặc tính nhất quán. Tuy nhiên, bạn có thể thay đổi hành vi này bằng cách biên dịch Lua với macro LUA_USE_APICHECK được xác định. [§4]

+1

Tuy nhiên, các tài liệu nói rằng' LUA_TNONE' do đó nên được kết quả, tuy nhiên' LUA_TNONE' là -1, không 9. có thể là họ xem xét kịch bản này (không tồn tại thay vì chỉ đơn giản là "không hợp lệ" chỉ mục) để thậm chí không được bao phủ bởi đó e trường hợp rror, và như vậy điều này trở thành UB. Có vẻ như mã hóa kém nếu đó là sự thật, mặc dù. –

+2

Mặc dù tôi đồng ý rằng điều này không giải thích được giá trị trả lại chính xác khi bạn nhấn vào hành vi không xác định là có thể chấp nhận được và 'lua_type' được ghi rõ ràng là được xác định cho" ind [ices] "hoặc (" valid "hoặc" non -valid (nhưng chấp nhận được) ind [ices] ". –

+0

@LightnessRacesinOrbit Bạn nhận ra rằng tập hợp những người bao gồm" họ "về lua là một tập hợp chứa lhf, phải không? =) –

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