• Advertisement
Sign in to follow this  

passing parameters

This topic is 4781 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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 ?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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);

----

// AngelScript

void 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));

// AngelScript
void 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);

// AngelScript
void Func(Entity &ent)
{
ent[23] = 23;
}



Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement