Jump to content

  • Log In with Google      Sign In   
  • Create Account


- - - - -

passing parameters


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 iram   Members   -  Reputation: 122

Like
0Likes
Like

Posted 20 December 2004 - 01:57 AM

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]

Sponsor:

#2 Andreas Jonsson   Moderators   -  Reputation: 3227

Like
0Likes
Like

Posted 20 December 2004 - 04:21 AM

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

#3 iram   Members   -  Reputation: 122

Like
0Likes
Like

Posted 20 December 2004 - 12:26 PM

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 ?



#4 iram   Members   -  Reputation: 122

Like
0Likes
Like

Posted 20 December 2004 - 12:52 PM


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.



#5 Andreas Jonsson   Moderators   -  Reputation: 3227

Like
0Likes
Like

Posted 21 December 2004 - 01:40 AM

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;
}




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




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS