Tôi đang sử dụng luabind 0.9.1 từ phân phối chính của Ryan Pavlik với Lua 5.1, cygwin trên Win XP SP3 + vá mới nhất x86, tăng 1,48, gcc 4.3.4. Lua và boost là các phiên bản được biên dịch trước của Cygwin.luabind: không thể truy xuất giá trị từ bảng được lập chỉ mục bởi các lớp không có sẵn
Tôi đã xây dựng thành công luabind trong cả phiên bản tĩnh và được chia sẻ.
Cả hai phiên bản đều vượt qua tất cả các bài kiểm tra EXCEPT cho bài kiểm tra test_object_identity.cpp thất bại trong cả hai phiên bản.
Tôi đã theo dõi sự cố sau: Nếu mục nhập trong bảng được tạo cho lớp không được tạo sẵn (tức là, không phải int, chuỗi, v.v.), giá trị KHÔNG THỂ được truy xuất.
Dưới đây là một mảnh mã đó chứng tỏ điều này:
#include "test.hpp"
#include <luabind/luabind.hpp>
#include <luabind/detail/debug.hpp>
using namespace luabind;
struct test_param
{
int obj;
};
void test_main(lua_State* L)
{
using namespace luabind;
module(L)
[
class_<test_param>("test_param")
.def_readwrite("obj", &test_param::obj)
];
test_param temp_object;
object tabc = newtable(L);
tabc[1] = 10;
tabc[temp_object] = 30;
TEST_CHECK(tabc[1] == 10); // passes
TEST_CHECK(tabc[temp_object] == 30); // FAILS!!!
}
tabc [1] thực sự là 10 trong khi tabc [temp_object] là KHÔNG 30! (thực tế, nó có vẻ là số không)
Tuy nhiên, nếu tôi sử dụng lặp lại để xem các mục nhập tabc, có hai mục nhập với cặp khóa/giá trị ĐÚNG.
Bất kỳ ý tưởng nào?
BTW, quá tải toán tử == như thế này:
#include <luabind/operator.hpp>
struct test_param
{
int obj;
bool operator==(test_param const& rhs) const
{
return obj == rhs.obj;
}
};
và
module(L)
[
class_<test_param>("test_param")
.def_readwrite("obj", &test_param::obj)
.def(const_self == const_self)
];
Không thay đổi kết quả.
Tôi cũng đã thử chuyển sang phương thức settable() và gettable() từ toán tử []. Kết quả là như nhau. Tôi có thể thấy với trình gỡ rối rằng chuyển đổi mặc định của khóa được gọi, vì vậy tôi đoán lỗi phát sinh từ một nơi nào đó trong đó, nhưng nó vượt ra ngoài tôi để tìm ra chính xác vấn đề là gì.
Như trường hợp thử nghiệm đơn giản cho thấy sau, chắc chắn là một lỗi trong chuyển đổi Luabind của với nhiều loại phức tạp:
struct test_param : wrap_base
{
int obj;
bool operator==(test_param const& rhs) const
{ return obj == rhs.obj ; }
};
void test_main(lua_State* L)
{
using namespace luabind;
module(L)
[
class_<test_param>("test_param")
.def(constructor<>())
.def_readwrite("obj", &test_param::obj)
.def(const_self == const_self)
];
object tabc, zzk, zzv;
test_param tp, tp1;
tp.obj = 123456;
// create new table
tabc = newtable(L);
// set tabc[tp] = 5;
// o k v
settable(tabc, tp, 5);
// get access to entry through iterator() API
iterator zzi(tabc);
// get the key object
zzk = zzi.key();
// read back the value through gettable() API
// o k
zzv = gettable(tabc, zzk);
// check the entry has the same value
// irrespective of access method
TEST_CHECK (*zzi == 5 &&
object_cast<int>(zzv) == 5);
// convert key to its REAL type (test_param)
tp1 = object_cast<test_param>(zzk);
// check two keys are the same
TEST_CHECK(tp == tp1);
// read the value back from table using REAL key type
zzv = gettable(tabc, tp1);
// check the value
TEST_CHECK(object_cast<int>(zzv) == 5);
// the previous call FAILS with
// Terminated with exception: "unable to make cast"
// this is because gettable() doesn't return
// a TRUE value, but nil instead
}
Hy vọng rằng, một người thông minh hơn tôi có thể con số này ra, Thx
tôi đã truy tìm vấn đề với thực tế là Luabind tạo ra một đối tượng DISTINCT MỚI MỌI thời gian bạn sử dụng một giá trị phức tạp làm khóa (nhưng nó KHÔNG nếu bạn sử dụng một nguyên thủy hoặc một đối tượng).
Dưới đây là một trường hợp thử nghiệm nhỏ mà chứng tỏ điều này:
struct test_param : wrap_base
{
int obj;
bool operator==(test_param const& rhs) const
{ return obj == rhs.obj ; }
};
void test_main(lua_State* L)
{
using namespace luabind;
module(L)
[
class_<test_param>("test_param")
.def(constructor<>())
.def_readwrite("obj", &test_param::obj)
.def(const_self == const_self)
];
object tabc, zzk, zzv;
test_param tp;
tp.obj = 123456;
tabc = newtable(L);
// o k v
settable(tabc, tp, 5);
iterator zzi(tabc), end;
std::cerr << "value = " << *zzi << "\n";
zzk = zzi.key();
// o k v
settable(tabc, tp, 6);
settable(tabc, zzk, 7);
for (zzi = iterator(tabc); zzi != end; ++zzi)
{
std::cerr << "value = " << *zzi << "\n";
}
}
Chú ý cách tabc [tp] đầu tiên có giá trị 5 và sau đó được ghi đè bằng 7 khi truy cập thông qua các đối tượng chủ chốt. Tuy nhiên, khi truy cập AGAIN thông qua tp, một mục mới sẽ được tạo. Đây là lý do tại sao gettable() thất bại sau đó.
Thx, David
bạn đã từng giải quyết vấn đề này chưa? Tôi đã gặp sự cố này khi sử dụng giá trị int làm khóa cho các bảng, ví dụ: local testTable = {[10] = "màu xanh lá cây", [9] = "màu cam", [8] = "màu vàng"} - nếu tôi sử dụng chuỗi thay vì các số làm khóa - nó hoạt động tốt - tôi cung cấp bảng này làm thông số đến một hàm C++ và tôi cũng nhận được lỗi truyền – Steve