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="">&amp;</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="">&lt;iostream&gt;</span><span class="">
</span><span class="">#include</span><span class=""> </span><span class="">&lt;conio.h&gt;</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="">&lt;</span><span class="">luabind\luabind</span><span class="">.</span><span class="">hpp</span><span class="">&gt;</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=""> &nbsp;</span><span class="">int</span><span class=""> x </span><span class="">=</span><span class=""> </span><span class="">2</span><span class="">;</span><span class="">


 &nbsp;</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="">   &nbsp;cout</span><span class="">&lt;&lt;</span><span class="">"x before = "</span><span class="">&lt;&lt;</span><span class=""> x </span><span class="">&lt;&lt;</span><span class="">endl</span><span class="">;


</span><span class="">&nbsp;   try 
    {
        call_function&lt;void&gt;(myLuaState, "test", boost::ref(x));
    }
    catch(const std::exception &amp;TheError) 
    {
        cerr &lt;&lt; TheError.what() &lt;&lt; endl;

    }
</span><span class=""></span><span class="">
    cout</span><span class="">&lt;&lt;</span><span class="">"x after = "</span><span class="">&lt;&lt;</span><span class=""> x </span><span class="">&lt;&lt;</span><span class="">endl</span><span class="">;


</span><span class=""> &nbsp; </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=""> &nbsp;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==--