passing parameters

Started by
3 comments, last by WitchLord 19 years, 4 months ago
i am trying to send a std::string as one of the parameters. string ret = "hello"; context->SetArguments(4, (asDWORD*)&ret, sizeof(string)/sizeof(long)); am i doing it correctly ? wonder why it must be the last parameter. if not, the script will not execute or it may corrupt some other parameters. [Edited by - iram on December 20, 2004 9:14:48 AM]
Advertisement
Passing objects by value to script functions is a complicated matter in AS 1.10.1. AS 2.x will greatly improve this. If you can it's better to have the script function take the object by reference, in which case you simply pass the pointer to the object.

I've written an article explaining the details of how to pass arguments to script functions. It ought to explain everything you need, if it doesn't then please let me know so that I can improve it. You'll find the article here: http://www.angelcode.com/angelscript/sdk/docs/articles/callscriptfunc.html.

Regards,
Andreas

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

thanks, i have read it before starting.

i do wanted to pass by reference with my pointers, but this is the part where it always do not work for me.

maybe you can help.

----------------- C++ -----------------
class Entity_Data
{
public:
long Lifespan;
long Stamina;
};


Entity_Data *Vars[5];

Vars[0] = new Entity_Data();
Vars[0]->Lifespan = 123;
Vars[0]->Stamina = 1111;


Context[0]->SetArguments(0, (asDWORD*)&i, 1);
Context[0]->SetArguments(1, (asDWORD*)&Vars[0], 1);
Context[0]->SetArguments(2, (asDWORD*)&Vars[0]->Stamina, 1);



----------------- angel code -----------------
void Draw (int id, Entity_Data *vars, int *byRef)
{
....
vars->Stamina = 10; //this works

byRef = 10; //this do not work!
}


how to get a pointer to Vars[0]->Stamina ?


how to register an array within a class correctly ?


class Entity
{
public:

long id;
long life;
long Data[32];
}


r = engine->RegisterObjectProperty("Entity", "int[] Data", offsetof(Entity, Data));


when i use ent->Data[0], it gives me an error.

You are passing the arguments to the script function correctly. The problem is that the script function declared the integer parameter to be a pointer to an integer, not a reference to an integer. To C++ this is the same thing, but to AngelScript it is not, as AngelScript doesn't allow the manipulation of pointers (because of security issues). What you need to do is to change the script function declaration to the following:

void Draw (int id, Entity_Data *vars, int &byRef){  ....  vars->Stamina = 10; //this works  byRef = 10; //this will now work}


You don't need to change the C++ code.

-----

AngelScript cannot use C++ arrays directly, as it needs to know the size of the array. If your C++ class has a member array, you could register a function for accessing the members of the array instead of registering the array as property. Example:

// C++long *ArrayElement(UINT idx, Entity *obj){  if( idx >= 32 )  {    asIScriptContext *ctx = asGetActiveContext();    ctx->SetException("Out of range");    return 0;  }  return &obj->Data[idx];}engine->RegisterObjectMethod("Entity", "int &Data(uint)", asFUNCTION(ArrayElement), asCALL_CDECL_OBJLAST);----// AngelScriptvoid Function(Entity &ent){  ent.Data(23) = 23;}


If you want AngelScript to understand the array, then you'll have to use an array object that AngelScript can understand. You can for example register a vector<int> to be used instead of the static array.

// C++#include "stdvector.h"RegisterVector<int>("int[]", "int", engine);class Entity{  long id;  long life;  vector<int> Data;}engine->RegisterObjectProperty("Entity", "int[] Data", offsetof(Entity, Data));// AngelScriptvoid Func(Entity &ent){  ent.Data[23] = 23;}


A third solution would be to register the [] operator directly for the Entity object.

// C++long *ArrayElement(UINT idx, Entity *obj){  if( idx >= 32 )  {    asIScriptContext *ctx = asGetActiveContext();    ctx->SetException("Out of range");    return 0;  }  return &obj->Data[idx];}engine->RegisterObjectBehaviour("Entity", asBEHAVE_INDEX, "int &f(uint)", asFUNCTION(ArrayElement), asCALL_CDECL_OBJLAST);// AngelScriptvoid Func(Entity &ent){  ent[23] = 23;}



AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

This topic is closed to new replies.

Advertisement