Jump to content

LUA CPP "how to" 6/7



5) How to receive returned parameters from LUA functions

(yes one or more)

come on, every time i edit the post, code /code get bad formatted and have to manually (again) correct it (really don't like to see un-indented code).



So, with an example will see how to receive parameters from LUA function scripts.


The example is basically the same as the one exposed in the previous tut (5/7) the only difference is that the function called has a Return sentence so is sending us something, and following the Invoke method, we have to catch that value.

It's good to test if the kind of value received is of the correct type and if so, then we have to convert it from LUA type to Cpp type, here an example:


LUA function declared on a script attached to the entity used next


function Script:average(intA, intB, intC)
  System:Print("executing average")
  return (intA + intB + intC)/3



float call_average(Entity* e, string funcName, int a, int b, int c)

  if (e->component == NULL) return false;
  bool success = false;

  //Get the component table
  int stacksize = Interpreter::GetStackSize();

  //Get the global error handler function
  int errorfunctionindex = 0;
#ifdef DEBUG
  errorfunctionindex = Interpreter::GetStackSize();

  if (Interpreter::IsTable())
    System::Print(" entity has script");
    if (Interpreter::IsFunction())
      System::Print(" " + funcName + " defined");
      Interpreter::PushValue(-2);//Push script table onto stack
#ifdef DEBUG
  errorfunctionindex = -(Interpreter::GetStackSize() - errorfunctionindex + 1);
      success = Interpreter::Invoke(4, 1, errorfunctionindex); //in=4, out=1
      //---------------------------- here the receiving part ******NEW******
      if (success)
        if (Interpreter::IsNumber())
          float retValue = Interpreter::ToNumber();
          return retValue;
      //how to retrieve more than one returned parameter:
      //if function returns two or more parameters, they are poped in inverse order
      //so be careful to ask for them in reverse order (from right to left)
      Interpreter::Pop(); //pop it
      if (Interpreter::IsNumber())
        float retValue = Interpreter::ToNumber();


Types that can be tested:

Interpreter::isBool, isFunction, isBreakpoint, isNumber, isConnected, isString, isObject, isTable


Types that can be converted to:

Interpreter::toNumber, toString, toBool o toObject


not so easy but with a recipe all things are made easy, no?


just in case you missed it on the code...

if you like you may return more than one value from LUA

LUA admit Return to give a list of comma separated values


Return value1, value1, ...


they are pushed and when popped, came in reverse order


you have to use


or retrieving each value and then testing it's type and converting back from lua type to c++ type


next tut is more long and perhaps i'll post later... smile.png


Next, Home, Previous


Recommended Comments

There are no comments to display.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...