I am new to angelscript and I have a problem where the first parameter to a registered object method is always the object itself. What can I do to fix this? Here is some example code:
[source lang="cpp"]void MessageCallback_(const asSMessageInfo *msg, void *param) { const char *type = "ERR "; if( msg->type == asMSGTYPE_WARNING ) type = "WARN"; else if( msg->type == asMSGTYPE_INFORMATION ) type = "INFO"; printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);}[/source]
[source lang="cpp"]class Person { public: Person() {} void printTwoInts(int a, int b); void AddRef() {} void ReleaseRef() {} static Person *refFactory() { return new Person(); };};Person::printTwoInts(int a, int b){ cout (int)this " " a " " b endl;}(had to remove left arrows for cout in the above code above)[/source]
[source lang="cpp"]int main() { asIScriptEngine *scriptEngine = asCreateScriptEngine(ANGELSCRIPT_VERSION); int r = scriptEngine->SetMessageCallback(asFUNCTION(MessageCallback_), 0, asCALL_CDECL);assert( r >= 0 ); r = scriptEngine->RegisterObjectType("Person", sizeof(Person), asOBJ_REF); assert( r >= 0 ); r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_FACTORY, "Person @f()", asFUNCTION(Person::refFactory), asCALL_CDECL); assert( r >= 0 ); r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_ADDREF, "void f()", asMETHOD(Person, AddRef), asCALL_THISCALL); assert( r >= 0 ); r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_RELEASE, "void f()", asMETHOD(Person, ReleaseRef), asCALL_THISCALL); assert( r >= 0 ); r = scriptEngine->RegisterObjectMethod("Person", "void printTwoInts(int a, int b)", asMETHOD(Person, printTwoInts), asCALL_THISCALL);assert( r >= 0 ); CScriptBuilder builder; r = builder.StartNewModule(scriptEngine, "Test"); assert( r >= 0 ); r = builder.AddSectionFromFile("./Test.as"); assert( r >= 0 ); r = builder.BuildModule();if( r < 0 ); assert( r >= 0 ); asIScriptModule *mod = scriptEngine->GetModule("Test"); asIScriptFunction *func = mod->GetFunctionByDecl("void main()"); asIScriptContext *ctx = scriptEngine->CreateContext(); ctx->Prepare(func); r = ctx->Execute(); return 0;}[/source]
The Test.as script is as:
[source lang="cpp"]void main() { Person p; p.printTwoInts(999,55);}[/source]
When run this outputs: "8097752 8097752 999" Meaning the first parameter is not an int but an object pointer. So the function calling is done wrong? But when I try to change asCALL_THISCALL to asCALL_CDECL, asCALL_STDCALL, asCALL_CDECL_OBJLAST, asCALL_CDECL_OBJFIRST or asCALL_GENERIC I get an error code: -24. -24 is asWRONG_CALLING_CONV but I don't know how to fix that. Do I need to use something else other then asMETHOD when registering the function? If so what?
I am using mingw 4.7.0.
Thanks.
Edited by Andreas Jonsson, 14 October 2012 - 05:25 PM.






