Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


- - - - -

constructor + templates => constructor isnt called


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
5 replies to this topic

#1 zerochen   Members   -  Reputation: 492

Like
0Likes
Like

Posted 26 November 2012 - 09:56 PM

hi,

i have a problem with the constructor and templates.
if i register my vector class with constructorDefault<T> it doesnt work because the constructorDefault function is never been called.
only then i use the constructorDefaultf function it works.
is there something i missed?

C++:
template<typename T>
void constructorDefault(void *memory) // this isnt called
{
	 new (memory) core::vector3d<T>();
}

void constructorDefaultf(void *memory) // works fine
{
	 new (memory) core::vector3d<float>();
}

template<typename T>
void deconstructor(void *memory)
{
	 ((core::vector3d<T>*)memory)->~vector3d<T>();
}

// called like that -> registerVector3dT<float>(engine, "vector3df", "float");
template<typename T>
void registerVector3dT(asIScriptEngine *engine, const char *typeName, const char *asType)
{
	 int r;
	 std::stringstream ss;

	// Bind Vector2d<T> class.
	r = engine->RegisterObjectType(typeName, sizeof(core::vector3d<T>), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert(r >= 0);

	 //this doesnt work
	 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructorDefault<T>, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);

	 // this works
	 //r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructorDefaultf, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);

	r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_DESTRUCT, "void f()", asFUNCTIONPR(deconstructor<T>, (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);
  
	 // Assignment vector3d<T>& operator=(const vector3d<T>& other)
	ss.str("");
	ss << typeName << "& opAssign(const " << typeName << " &in)";
	r = engine->RegisterObjectMethod(typeName, ss.str().c_str(), asMETHODPR(core::vector3d<T>, operator=, (const core::vector3d<T>&), core::vector3d<T>&), asCALL_THISCALL); assert(r >= 0);

	// Bind core::vector3d<T> class properties.
	ss.str("");
	ss << asType << " X";
	r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, X)); assert(r >= 0);
	ss.str("");
	ss << asType << " Y";
	r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, Y)); assert(r >= 0);
	ss.str("");
	ss << asType << " Z";
	r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(core::vector3d<T>, Z)); assert(r >= 0);
}

Angelscript:
class d
{
	 void dummy()
	 {
	 	 vector3df ss();
	 	 vector3df sss();
	 	 sss = ss;
	 }
}

in that line it crashed:
void asCScriptEngine::CallObjectMethod(void *obj, asSSystemFunctionInterface *i, asCScriptFunction *s)
line 3394: (((asCSimpleDummy*)obj)->*f)();

callstack:
game.exe![thunk]:asCScriptObject::`vcall'{4,{flat}}' }'() C++
game.exe!asCScriptEngine::CallObjectMethod(void * obj, asSSystemFunctionInterface * i, asCScriptFunction * s) Zeile 3413 C++
game.exe!asCScriptEngine::CallObjectMethod(void * obj, int func) Zeile 3367 C++
game.exe!asCContext::ExecuteNext() Zeile 2503 C++
game.exe!asCContext::Execute() Zeile 1155 C++

i guess it crashs there because the constructor isnt called.
any help would be appreciated
thx

Sponsor:

#2 Andreas Jonsson   Moderators   -  Reputation: 3415

Like
0Likes
Like

Posted 27 November 2012 - 03:16 AM

This appears to be a problem with the C++ compiler. For some reason it is not instanciating the template function properly when you register the constructor behaviour.

What C++ compiler and version are you using?
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 zerochen   Members   -  Reputation: 492

Like
0Likes
Like

Posted 27 November 2012 - 07:46 AM

hi,

i use visual studio 2012, the lastest angelscript rev and win 7 64bit.

i also noticed that this only happens with the default constructor (no arguments are passed). for other methods and behaviours it works.

Edited by zerochen, 27 November 2012 - 07:51 AM.


#4 Andreas Jonsson   Moderators   -  Reputation: 3415

Like
0Likes
Like

Posted 27 November 2012 - 08:25 AM

I'm pretty sure it is a limitation (or maybe a bug) with how templates work in MSVC++. I'll try to reproduce this to further investigate.
AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

#5 zerochen   Members   -  Reputation: 492

Like
0Likes
Like

Posted 29 November 2012 - 11:08 AM

hi,

i finally found the problem. the problem was that i register the default constructor for the vector and the matrix with the same functionname in different source files.
so the defaullt constructor of the maxtrix overrides the vectors default constructor because they have the same structure & name.

thanks anyway

#6 Andreas Jonsson   Moderators   -  Reputation: 3415

Like
0Likes
Like

Posted 29 November 2012 - 12:43 PM

Ah, yes. I remember telling this very same thing to another user that was also having problem with templated wrappers.

I think I'll add an observation about this in the manual. Hopefully it will help avoid the same problem for other users.

Thanks,
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




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