Re: How to pass value from C++ to lua function by reference?
Michael Steinberg <[email protected]> Thu, 07 Aug 2014 15:19:52 +0200
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--===============3475236577581593428==
Content-Type: multipart/alternative;
boundary="------------080205050803080805020405"
This is a multi-part message in MIME format.
--------------080205050803080805020405
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Hello,
It is impossible to pass object types that are modelled in lua with
built-in types by reference. In Lua, there exists no attribute to types
like reference or value type. A type is either a reference type
(tables), or a value type (built-in types like number).
What you can do however is return the new value in the lua-side. A
policy could be established, that transforms reference integral types to
a list of parsed return types, so it is transparent on the c++ side.
That would place hard constraints on the lua side though.
Kind regards,
Michael
Am 03.08.2014 21:09, schrieb 1 1:
>
> 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 = 7
> end|
>
> 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.
>
>
> ------------------------------------------------------------------------------
> 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
>
>
> _______________________________________________
> luabind-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/luabind-user
--------------080205050803080805020405
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Hello,<br>
<br>
It is impossible to pass object types that are modelled in lua
with built-in types by reference. In Lua, there exists no
attribute to types like reference or value type. A type is either
a reference type (tables), or a value type (built-in types like
number).<br>
What you can do however is return the new value in the lua-side. A
policy could be established, that transforms reference integral
types to a list of parsed return types, so it is transparent on
the c++ side. That would place hard constraints on the lua side
though.<br>
<br>
Kind regards,<br>
Michael<br>
<br>
Am 03.08.2014 21:09, schrieb 1 1:<br>
</div>
<blockquote
cite="mid:CAMbZc6y5H+mQx4VmLVpZTKY4o5viYhk-LiLeBaJTqzZ2+R1LsQ@mail.gmail.com"
type="cite">
<div dir="ltr">
<div class="" itemprop="text">
<p>When programming on C++, you can do the following:</p>
<pre style="" class=""><code><span class="">void</span><span class=""> byReference</span><span class="">(</span><span class="">int</span><span class=""> </span><span class="">&</span><span class="">y</span><span class="">)</span><span class="">
</span><span class="">{</span><span class="">
y </span><span class="">=</span><span class=""> </span><span class="">5</span><span class="">;</span><span class="">
</span><span class="">}</span><span class="">
</span><span class="">int</span><span class=""> main</span><span class="">()</span><span class="">
</span><span class="">{</span><span class="">
</span><span class="">int</span><span class=""> x </span><span class="">=</span><span class=""> </span><span class="">2</span><span class="">;</span><span class=""> </span><span class="">// x = 2</span><span class="">
byReference</span><span class="">(</span><span class="">x</span><span class="">);</span><span class=""> </span><span class="">// x = 5</span><span class="">
</span><span class="">}</span></code></pre>
<p>How to do the same using luabind?</p>
<p>Luabind docs <a moz-do-not-send="true"
href="http://www.rasterbar.com/products/luabind/docs.html#calling-lua-functions"
rel="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>
<p>Like this:</p>
<pre style="" class=""><code><span class="">int</span><span class=""> ret </span><span class="">=</span><span class=""> call_function</span><span class="">(</span><span class="">L</span><span class="">,</span><span class=""> </span><span class="">"fun"</span><span class="">,</span><span class=""> boost</span><span class="">::</span><span class="">ref</span><span class="">(</span><span class="">val</span><span class="">));</span></code></pre>
</blockquote>
<p>But when I'm trying to do this:</p>
<pre style="" class=""><code><span class="">#include</span><span class=""> </span><span class=""><iostream></span><span class="">
</span><span class="">#include</span><span class=""> </span><span class=""><conio.h></span><span class="">
</span><span class="">extern</span><span class=""> </span><span class="">"C"</span><span class="">
</span><span class="">{</span><span class="">
</span><span class="">#include</span><span class=""> </span><span class="">"lua.h"</span><span class="">
</span><span class="">#include</span><span class=""> </span><span class="">"lualib.h"</span><span class="">
</span><span class="">#include</span><span class=""> </span><span class="">"lauxlib.h"</span><span class="">
</span><span class="">}</span><span class="">
</span><span class="">#include</span><span class=""> </span><span class=""><</span><span class="">luabind\luabind</span><span class="">.</span><span class="">hpp</span><span class="">></span><span class="">
</span><span class="">using</span><span class=""> </span><span class="">namespace</span><span class=""> std</span><span class="">;</span><span class="">
</span><span class="">using</span><span class=""> </span><span class="">namespace</span><span class=""> luabind</span><span class="">;</span><span class="">
</span><span class="">int</span><span class=""> main</span><span class="">()</span><span class="">
</span><span class="">{</span><span class="">
lua_State </span><span class="">*</span><span class="">myLuaState </span><span class="">=</span><span class=""> luaL_newstate</span><span class="">();</span><span class="">
open</span><span class="">(</span><span class="">myLuaState</span><span class="">);
</span><span class=""> </span><span class="">int</span><span class=""> x </span><span class="">=</span><span class=""> </span><span class="">2</span><span class="">;</span><span class="">
</span><span class="">do</span><span class="">
</span><span class="">{</span><span class="">
luaL_dofile</span><span class="">(</span><span class="">myLuaState</span><span class="">,</span><span class=""> </span><span class="">"script.lua"</span><span class="">);
</span><span class=""> cout</span><span class=""><<</span><span class="">"x before = "</span><span class=""><<</span><span class=""> x </span><span class=""><<</span><span class="">endl</span><span class="">;
</span><span class=""> try
{
call_function<void>(myLuaState, "test", boost::ref(x));
}
catch(const std::exception &TheError)
{
cerr << TheError.what() << endl;
}
</span><span class=""></span><span class="">
cout</span><span class=""><<</span><span class="">"x after = "</span><span class=""><<</span><span class=""> x </span><span class=""><<</span><span class="">endl</span><span class="">;
</span><span class=""> </span><span class="">}</span><span class=""> </span><span class="">while</span><span class="">(</span><span class="">_getch</span><span class="">()</span><span class=""> </span><span class="">!=</span><span class=""> </span><span class="">27</span><span class="">);
</span><span class=""> lua_close</span><span class="">(</span><span class="">myLuaState</span><span class="">);</span><span class="">
</span><span class="">}</span></code><code><span class=""></span></code></pre>
<p>script.lua:</p>
<pre style="" class=""><code><span class="">function</span><span class=""> test</span><span class="">(</span><span class="">x</span><span class="">)</span><span class="">
x </span><span class="">=</span><span class=""> </span><span class="">7</span><span class="">
</span><span class="">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, 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</p>
<p>Thanks.<br>
</p>
P.S:<br>
</div>
I posted the same question on <a moz-do-not-send="true"
href="http://stackoverflow.com/questions/25099437/luabind-how-to-pass-value-from-c-to-lua-function-by-reference">StackOverflow</a>,
but seems like nobody knows what to do.</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">------------------------------------------------------------------------------
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.
<a class="moz-txt-link-freetext" href="http://p.sf.net/sfu/bds">http://p.sf.net/sfu/bds</a></pre>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
luabind-user mailing list
<a class="moz-txt-link-abbreviated" href="mailto:[email protected]">[email protected]</a>
<a class="moz-txt-link-freetext" href="https://lists.sourceforge.net/lists/listinfo/luabind-user">https://lists.sourceforge.net/lists/listinfo/luabind-user</a>
</pre>
</blockquote>
<br>
</body>
</html>
--------------080205050803080805020405--
--===============3475236577581593428==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
--===============3475236577581593428==
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
--===============3475236577581593428==--