How to pass value from C++ to lua function by reference?

1 1 <[email protected]> Sun, 3 Aug 2014 22:09:57 +0300
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <CAMbZc6y5H+mQx4VmLVpZTKY4o5viYhk-LiLeBaJTqzZ2+R1LsQ@mail.gmail.com>
--===============3438669350340916005==
Content-Type: multipart/alternative; boundary=089e0158bd9849be4704ffbe5ec7

--089e0158bd9849be4704ffbe5ec7
Content-Type: text/plain; charset=UTF-8

When programming on C++, you can do the following:

void byReference(int &y){
    y = 5;}
int main(){
   int x = 2;      // x = 2
   byReference(x); // x = 5}

How to do the same using luabind?

Luabind docs says
<http://www.rasterbar.com/products/luabind/docs.html#calling-lua-functions>:

If you want to pass a parameter as a reference, you have to wrap it with
the Boost.Ref.

Like this:

int ret = call_function(L, "fun", boost::ref(val));

 But when I'm trying to do this:

#include <iostream>#include <conio.h>
extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"}
#include <luabind\luabind.hpp>
using namespace std;using namespace luabind;
int main() {
  lua_State *myLuaState = luaL_newstate();
  open(myLuaState);

  int x = 2;

  do
  {
    luaL_dofile(myLuaState, "script.lua");

    cout<<"x before = "<< x <<endl;

    try
    {
        call_function<void>(myLuaState, "test", boost::ref(x));
    }
    catch(const std::exception &TheError)
    {
        cerr << TheError.what() << endl;
    }

    cout<<"x after = "<< x <<endl;

   } while(_getch() != 27);

  lua_close(myLuaState);}

script.lua:

function test(x)
    x = 7end

It gives me a "Trying to use unregistered class" error.

So, how to pass value from C++ to lua function by reference, so I can
change it inside the script and it will be changed in c++ program too? I'm
using boost 1.55.0, lua 5.1, luabind 0.9.1

Thanks.
P.S:
I posted the same question on StackOverflow
<http://stackoverflow.com/questions/25099437/luabind-how-to-pass-value-from-c-to-lua-function-by-reference>,
but seems like nobody knows what to do.

--089e0158bd9849be4704ffbe5ec7
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"" itemprop=3D"text">

        <p>When programming on C++, you can do the following:</p>

<pre style class=3D""><code><span class=3D"">void</span><span class=3D""> b=
yReference</span><span class=3D"">(</span><span class=3D"">int</span><span =
class=3D""> </span><span class=3D"">&amp;</span><span class=3D"">y</span><s=
pan class=3D"">)</span><span class=3D"">
</span><span class=3D"">{</span><span class=3D"">
    y </span><span class=3D"">=3D</span><span class=3D""> </span><span clas=
s=3D"">5</span><span class=3D"">;</span><span class=3D"">
</span><span class=3D"">}</span><span class=3D"">

</span><span class=3D"">int</span><span class=3D""> main</span><span class=
=3D"">()</span><span class=3D"">
</span><span class=3D"">{</span><span class=3D"">
   </span><span class=3D"">int</span><span class=3D""> x </span><span class=
=3D"">=3D</span><span class=3D""> </span><span class=3D"">2</span><span cla=
ss=3D"">;</span><span class=3D"">      </span><span class=3D"">// x =3D 2</=
span><span class=3D"">
   byReference</span><span class=3D"">(</span><span class=3D"">x</span><spa=
n class=3D"">);</span><span class=3D""> </span><span class=3D"">// x =3D 5<=
/span><span class=3D"">
</span><span class=3D"">}</span></code></pre>

<p>How to do the same using luabind?</p>

<p>Luabind docs <a href=3D"http://www.rasterbar.com/products/luabind/docs.h=
tml#calling-lua-functions" rel=3D"nofollow">says</a>:</p>

<blockquote>
  <p>If you want to pass a parameter as a reference, you have to wrap it
  with the <code>Boost.Ref</code>.</p>
 =20
  <p>Like this:</p>

<pre style class=3D""><code><span class=3D"">int</span><span class=3D""> re=
t </span><span class=3D"">=3D</span><span class=3D""> call_function</span><=
span class=3D"">(</span><span class=3D"">L</span><span class=3D"">,</span><=
span class=3D""> </span><span class=3D"">&quot;fun&quot;</span><span class=
=3D"">,</span><span class=3D""> boost</span><span class=3D"">::</span><span=
 class=3D"">ref</span><span class=3D"">(</span><span class=3D"">val</span><=
span class=3D"">));</span></code></pre>

</blockquote>

<p>But when I&#39;m trying to do this:</p>

<pre style class=3D""><code><span class=3D"">#include</span><span class=3D"=
"> </span><span class=3D"">&lt;iostream&gt;</span><span class=3D"">
</span><span class=3D"">#include</span><span class=3D""> </span><span class=
=3D"">&lt;conio.h&gt;</span><span class=3D"">

</span><span class=3D"">extern</span><span class=3D""> </span><span class=
=3D"">&quot;C&quot;</span><span class=3D"">=20
</span><span class=3D"">{</span><span class=3D"">
    </span><span class=3D"">#include</span><span class=3D""> </span><span c=
lass=3D"">&quot;lua.h&quot;</span><span class=3D"">
    </span><span class=3D"">#include</span><span class=3D""> </span><span c=
lass=3D"">&quot;lualib.h&quot;</span><span class=3D"">
    </span><span class=3D"">#include</span><span class=3D""> </span><span c=
lass=3D"">&quot;lauxlib.h&quot;</span><span class=3D"">
</span><span class=3D"">}</span><span class=3D"">

</span><span class=3D"">#include</span><span class=3D""> </span><span class=
=3D"">&lt;</span><span class=3D"">luabind\luabind</span><span class=3D"">.<=
/span><span class=3D"">hpp</span><span class=3D"">&gt;</span><span class=3D=
"">

</span><span class=3D"">using</span><span class=3D""> </span><span class=3D=
"">namespace</span><span class=3D""> std</span><span class=3D"">;</span><sp=
an class=3D"">
</span><span class=3D"">using</span><span class=3D""> </span><span class=3D=
"">namespace</span><span class=3D""> luabind</span><span class=3D"">;</span=
><span class=3D"">

</span><span class=3D"">int</span><span class=3D""> main</span><span class=
=3D"">()</span><span class=3D"">=20
</span><span class=3D"">{</span><span class=3D"">
  lua_State </span><span class=3D"">*</span><span class=3D"">myLuaState </s=
pan><span class=3D"">=3D</span><span class=3D""> luaL_newstate</span><span =
class=3D"">();</span><span class=3D"">
  open</span><span class=3D"">(</span><span class=3D"">myLuaState</span><sp=
an class=3D"">);<br><br></span><span class=3D""> =C2=A0</span><span class=
=3D"">int</span><span class=3D""> x </span><span class=3D"">=3D</span><span=
 class=3D""> </span><span class=3D"">2</span><span class=3D"">;</span><span=
 class=3D""><br>
<br> =C2=A0</span><span class=3D"">do</span><span class=3D"">
  </span><span class=3D"">{</span><span class=3D"">
    luaL_dofile</span><span class=3D"">(</span><span class=3D"">myLuaState<=
/span><span class=3D"">,</span><span class=3D""> </span><span class=3D"">&q=
uot;script.lua&quot;</span><span class=3D"">);<br><br></span><span class=3D=
"">   =C2=A0cout</span><span class=3D"">&lt;&lt;</span><span class=3D"">&qu=
ot;x before =3D &quot;</span><span class=3D"">&lt;&lt;</span><span class=3D=
""> x </span><span class=3D"">&lt;&lt;</span><span class=3D"">endl</span><s=
pan class=3D"">;<br>
<br></span><span class=3D"">=C2=A0   try <br>    {<br>        call_function=
&lt;void&gt;(myLuaState, &quot;test&quot;, boost::ref(x));<br>    }<br>    =
catch(const std::exception &amp;TheError) <br>    {<br>        cerr &lt;&lt=
; TheError.what() &lt;&lt; endl;<br>
    }<br></span><span class=3D""></span><span class=3D"">
    cout</span><span class=3D"">&lt;&lt;</span><span class=3D"">&quot;x aft=
er =3D &quot;</span><span class=3D"">&lt;&lt;</span><span class=3D""> x </s=
pan><span class=3D"">&lt;&lt;</span><span class=3D"">endl</span><span class=
=3D"">;<br>
<br></span><span class=3D""> =C2=A0 </span><span class=3D"">}</span><span c=
lass=3D""> </span><span class=3D"">while</span><span class=3D"">(</span><sp=
an class=3D"">_getch</span><span class=3D"">()</span><span class=3D""> </sp=
an><span class=3D"">!=3D</span><span class=3D""> </span><span class=3D"">27=
</span><span class=3D"">);<br>
<br></span><span class=3D""> =C2=A0lua_close</span><span class=3D"">(</span=
><span class=3D"">myLuaState</span><span class=3D"">);</span><span class=3D=
"">
</span><span class=3D"">}</span></code><code><span class=3D""></span></code=
></pre>

<p>script.lua:</p>

<pre style class=3D""><code><span class=3D"">function</span><span class=3D"=
"> test</span><span class=3D"">(</span><span class=3D"">x</span><span class=
=3D"">)</span><span class=3D"">
    x </span><span class=3D"">=3D</span><span class=3D""> </span><span clas=
s=3D"">7</span><span class=3D"">
</span><span class=3D"">end</span></code></pre>

<p>It gives me a <code>&quot;Trying to use unregistered class&quot;</code> =
error.</p><p>So, how to pass value from C++ to lua function by reference, s=
o I can
 change it inside the script and it will be changed in c++ program too?=20
I&#39;m using boost 1.55.0, lua 5.1, luabind 0.9.1</p><p>Thanks.<br></p>P.S=
:<br></div>I posted the same question on <a href=3D"http://stackoverflow.co=
m/questions/25099437/luabind-how-to-pass-value-from-c-to-lua-function-by-re=
ference">StackOverflow</a>, but seems like nobody knows what to do.</div>

--089e0158bd9849be4704ffbe5ec7--


--===============3438669350340916005==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
--===============3438669350340916005==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user

--===============3438669350340916005==--