मैं लुआ 5.1 के साथ रयान पावलिक के मास्टर वितरण से लुइबिंड 0.9.1 का उपयोग कर रहा हूं, विन XP SP3 + नवीनतम पैच x86 पर सिग्विन, 1.48, जीसीसी बढ़ाएं 4.3.4। लुआ और बूस्ट साइगविन प्री-संकलित संस्करण हैं।luabind: गैर-निर्मित कक्षाओं द्वारा अनुक्रमित तालिका से मूल्यों को पुनर्प्राप्त नहीं किया जा सकता
मैंने सफलतापूर्वक दोनों स्थिर और साझा संस्करणों में लुभाइंड बनाया है।
दोनों संस्करण test_object_identity.cpp परीक्षण के लिए सभी परीक्षणों को पार करते हैं जो दोनों संस्करणों में विफल रहता है।
मैंने निम्न समस्या को हल किया है: यदि किसी तालिका में कोई प्रविष्टि गैर अंतर्निर्मित कक्षा (यानी, int, string, आदि नहीं) के लिए बनाई गई है, तो मान पुनर्प्राप्त नहीं किया जा सकता है।
यहाँ एक कोड टुकड़ा है कि इस दर्शाता है:
#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] वास्तव में 10 है, जबकि tabc [temp_object] 30 नहीं है! (वास्तव में, यह शून्य लगता है)
हालांकि, अगर मैं टैबक प्रविष्टियों पर जाने के लिए पुनरावृत्ति का उपयोग करता हूं, तो कॉररेक्ट कुंजी/मूल्य जोड़े के साथ दो प्रविष्टियां हैं।
कोई विचार?
Btw, इस तरह == ऑपरेटर ओवरलोडिंग:
#include <luabind/operator.hpp>
struct test_param
{
int obj;
bool operator==(test_param const& rhs) const
{
return obj == rhs.obj;
}
};
और
module(L)
[
class_<test_param>("test_param")
.def_readwrite("obj", &test_param::obj)
.def(const_self == const_self)
];
परिणाम को बदल नहीं करता है।
मैंने [] ऑपरेटर से settable() और gettable() पर स्विच करने का भी प्रयास किया। नतीजा वही है। मैं डीबगर के साथ देख सकता हूं कि कुंजी का डिफ़ॉल्ट रूपांतरण लागू होता है, इसलिए मुझे लगता है कि त्रुटि कहीं से उत्पन्न होती है, लेकिन यह पता लगाने के लिए कि वास्तव में समस्या क्या है।
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
}
उम्मीद है, किसी को होशियार से मुझे यह पता लगा सकते हैं, Thx
मैं:
निम्नलिखित सरल परीक्षण का मामला शो के रूप में, वहाँ निश्चित रूप से जटिल प्रकार के लिए Luabind के रूपांतरण में एक बग कर रहे हैं इस तथ्य को हल कर लिया है कि लुबाइंड एक नई डिस्टिंट ऑब्जेक्ट बनाता है हर बार जब आप जटिल मान का उपयोग कुंजी के रूप में करते हैं (लेकिन यदि आप आदिम एक या ऑब्जेक्ट का उपयोग नहीं करते हैं)।
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";
}
}
सूचना कैसे tabc [tp] पहला मान 5 है और फिर जब कुंजी वस्तु के माध्यम से पहुँचा 7 के साथ ओवरराइट है:
यहां एक छोटा परीक्षण का मामला है कि इस दर्शाता है। हालांकि, जब टीपी के माध्यम से फिर से पहुंचाया जाता है, तो एक नई प्रविष्टि बन जाती है। यही कारण है कि gettable() बाद में विफल रहता है।
Thx, डेविड
क्या आपने कभी इस मुद्दे को हल किया है? टेबल के लिए कुंजी के रूप में int मानों का उपयोग करते समय मुझे पहले से ही यह समस्या है। स्थानीय परीक्षणटेबल = {[10] = "हरा", [9] = "नारंगी", [8] = "पीला"} - अगर मैं संख्याओं की बजाय तारों के बजाय स्ट्रिंग का उपयोग करता हूं - यह ठीक काम करता है - मैं इस तालिका को एक परम के रूप में देता हूं एक सी ++ फ़ंक्शन के लिए और मुझे भी कास्ट त्रुटि मिलती है – Steve