Exporting array to Lua

Nicholas Mario Wardhana <[email protected]>
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <[email protected]>
Hi all,

I have a problem in exporting an array member of a struct to Lua
(snippet in footnote). I noticed that currently Lua cannot do this, so
I searched and found this:

http://old.nabble.com/how-to-bind-a-raw-array--td21440448.html

It lists the wrapper methods to convert the Lua table into the
corresponding array. However, it uses luabind::argument, which is not
found (deprecated feature?) so I change it to object and the methods
can compile. Now, if I use the get function, the program can compile,
but it can't if I also pass the set function. I include the error
message below. So, did I do something wrong here? Any help on this
issue is appreciated. Thank you very much.

Regards,
Nicholas Mario Wardhana



//=====================snippet
//
struct FragmentEdge
{
	// ...
};

struct Fragment
{
	FragmentEdge e[4];
};

luabind::object get_data_Fragment_e(Fragment* const f, lua_State* L)
{
	luabind::object result = luabind::newtable(L);

	for (int i = 0; i < 4; ++i)
		result[i + 1] = f->e[i];

	return result;
}

void set_data_Fragment_e(Fragment* const f, luabind::object const& table)
{
	for (int i = 0; i < 4; ++i)
		f->e[i] = luabind::object_cast<FragmentEdge>(table[i + 1]);
}

// export function
class_<Fragment>("_Fragment")
	.def("e", get_data_Fragment_e, set_data_Fragment_e, raw(_2)) ,

//
//=====================

//===================== error message
//

1>------ Build started: Project: GameFactoryDemo, Configuration: Debug
Win32 ------
1>Compiling...
1>ScriptEngine.cpp
1>d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\detail\call.hpp(354)
: error C2664: 'luabind::detail::raw_converter::apply' : cannot
convert parameter 2 from 'luabind::detail::by_const_reference<T>' to
'luabind::detail::by_pointer<T>'
1>        with
1>        [
1>            T=luabind::adl::object
1>        ]
1>        and
1>        [
1>            T=lua_State
1>        ]
1>        No user-defined-conversion operator available that can
perform this conversion, or the operator cannot be called
1>        d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\detail\call.hpp(386)
: see reference to function template instantiation 'int
luabind::detail::returns<void>::call<WrappedClass,Policies,A0,A1>(void
(__cdecl *)(A0,A1),WrappedClass *,lua_State *,const Policies *)' being
compiled
1>        with
1>        [
1>            WrappedClass=GameFactory::C2Template::Fragment,
1>            Policies=luabind::detail::policy_cons<luabind::detail::raw_policy<2>,luabind::detail::null_type>,
1>            A0=GameFactory::C2Template::Fragment *,
1>            A1=const luabind::adl::object &
1>        ]
1>        d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\class.hpp(210)
: see reference to function template instantiation 'int
luabind::detail::call<Class,Policies,void,GameFactory::C2Template::Fragment*,const
luabind::adl::object&>(R (__cdecl *)(A0,A1),WrappedClass *,lua_State
*,const Policies *)' being compiled
1>        with
1>        [
1>            Class=GameFactory::C2Template::Fragment,
1>            Policies=luabind::detail::policy_cons<luabind::detail::raw_policy<2>,luabind::detail::null_type>,
1>            R=void,
1>            A0=GameFactory::C2Template::Fragment *,
1>            A1=const luabind::adl::object &,
1>            WrappedClass=GameFactory::C2Template::Fragment
1>        ]
1>        d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\class.hpp(209)
: while compiling class template member function 'int
luabind::detail::mem_fn_callback<Fn,Class,Policies>::operator
()(lua_State *) const'
1>        with
1>        [
1>            Fn=void (__cdecl *)(GameFactory::C2Template::Fragment
*,const luabind::adl::object &),
1>            Class=GameFactory::C2Template::Fragment,
1>            Policies=luabind::detail::policy_cons<luabind::detail::raw_policy<2>,luabind::detail::null_type>
1>        ]
1>        d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\class.hpp(1520)
: see reference to class template instantiation
'luabind::detail::mem_fn_callback<Fn,Class,Policies>' being compiled
1>        with
1>        [
1>            Fn=void (__cdecl *)(GameFactory::C2Template::Fragment
*,const luabind::adl::object &),
1>            Class=GameFactory::C2Template::Fragment,
1>            Policies=luabind::detail::policy_cons<luabind::detail::raw_policy<2>,luabind::detail::null_type>
1>        ]
1>        d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\class.hpp(1119)
: see reference to function template instantiation 'luabind::class_<T>
&luabind::class_<T>::virtual_def<luabind::adl::object(__cdecl
*)(GameFactory::C2Template::Fragment *,lua_State *),void(__cdecl
*)(GameFactory::C2Template::Fragment *,const luabind::adl::object
&),Policies>(const char *,const F &,const Default &,const Policies
&,boost::mpl::false_)' being compiled
1>        with
1>        [
1>            T=GameFactory::C2Template::Fragment,
1>            Policies=luabind::detail::policy_cons<luabind::detail::raw_policy<2>,luabind::detail::null_type>,
1>            F=luabind::adl::object (__cdecl
*)(GameFactory::C2Template::Fragment *,lua_State *),
1>            Default=void (__cdecl
*)(GameFactory::C2Template::Fragment *,const luabind::adl::object &)
1>        ]
1>        d:\nixx\project\gfa_work\gamefactorydemo\gamefactory\scriptengine.cpp(1224)
: see reference to function template instantiation 'luabind::class_<T>
&luabind::class_<T>::def<luabind::adl::object(__cdecl
*)(GameFactory::C2Template::Fragment *,lua_State *),void(__cdecl
*)(GameFactory::C2Template::Fragment *,const luabind::adl::object
&),luabind::detail::policy_cons<H,luabind::detail::null_type>>(const
char *,F,Default,const Policies &)' being compiled
1>        with
1>        [
1>            T=GameFactory::C2Template::Fragment,
1>            H=luabind::detail::raw_policy<2>,
1>            F=luabind::adl::object (__cdecl
*)(GameFactory::C2Template::Fragment *,lua_State *),
1>            Default=void (__cdecl
*)(GameFactory::C2Template::Fragment *,const luabind::adl::object &),
1>            Policies=luabind::detail::policy_cons<luabind::detail::raw_policy<2>,luabind::detail::null_type>
1>        ]
1>d:\nixx\project\gfa_work\gamefactorydemo\references\luabind\luabind\detail\call.hpp(364)
: error C2664: 'luabind::detail::raw_converter::converter_postcall' :
cannot convert parameter 2 from
'luabind::detail::by_const_reference<T>' to
'luabind::detail::by_pointer<T>'
1>        with
1>        [
1>            T=luabind::adl::object
1>        ]
1>        and
1>        [
1>            T=lua_State
1>        ]
1>        No user-defined-conversion operator available that can
perform this conversion, or the operator cannot be called
1>Build log was saved at
"file://d:\nixx\Project\GFA_Work\GameFactoryDemo\Debug\BuildLog.htm"
1>GameFactoryDemo - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

//
//=====================

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.