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"">&</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"">"fun"</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'm trying to do this:</p>
<pre style class=3D""><code><span class=3D"">#include</span><span class=3D"=
"> </span><span class=3D""><iostream></span><span class=3D"">
</span><span class=3D"">#include</span><span class=3D""> </span><span class=
=3D""><conio.h></span><span class=3D"">
</span><span class=3D"">extern</span><span class=3D""> </span><span class=
=3D"">"C"</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"">"lua.h"</span><span class=3D"">
</span><span class=3D"">#include</span><span class=3D""> </span><span c=
lass=3D"">"lualib.h"</span><span class=3D"">
</span><span class=3D"">#include</span><span class=3D""> </span><span c=
lass=3D"">"lauxlib.h"</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""><</span><span class=3D"">luabind\luabind</span><span class=3D"">.<=
/span><span class=3D"">hpp</span><span class=3D"">></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"</span><span class=3D"">);<br><br></span><span class=3D=
""> =C2=A0cout</span><span class=3D""><<</span><span class=3D"">&qu=
ot;x before =3D "</span><span class=3D""><<</span><span class=3D=
""> x </span><span class=3D""><<</span><span class=3D"">endl</span><s=
pan class=3D"">;<br>
<br></span><span class=3D"">=C2=A0 try <br> {<br> call_function=
<void>(myLuaState, "test", boost::ref(x));<br> }<br> =
catch(const std::exception &TheError) <br> {<br> cerr <<=
; TheError.what() << endl;<br>
}<br></span><span class=3D""></span><span class=3D"">
cout</span><span class=3D""><<</span><span class=3D"">"x aft=
er =3D "</span><span class=3D""><<</span><span class=3D""> x </s=
pan><span class=3D""><<</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>"Trying to use unregistered class"</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'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==--