Jump to content
  • Advertisement
Sign in to follow this  
Wavesonics

Registering struct's properties

This topic is 3368 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'm trying to register this struct with AS:
struct Vector2d {
    float x;
    float y;

    Vector2d();
    Vector2d( const Vector2d& v );
    Vector2d( float argX, float argY );

    float length() const;
    Vector2d normalize() const;
    float distanceTo( const Vector2d& v ) const;
    float dot( const Vector2d& v ) const;
};

And here is how I am trying to do the registration:
    // Register our Vector
    r = m_engine->RegisterObjectType("Vector2d", sizeof(Vector2d), asOBJ_VALUE | asOBJ_APP_CLASS | asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR ); assert( r >= 0 );
    r = m_engine->RegisterObjectBehaviour("Vector2d", asBEHAVE_CONSTRUCT, "void Vector2d()", asFUNCTION(DefaultCtor<Vector2d>), asCALL_CDECL_OBJLAST); assert( r >= 0 );
    r = m_engine->RegisterObjectBehaviour("Vector2d", asBEHAVE_DESTRUCT, "void ~Vector2d()", asFUNCTION(DumbyFunc), asCALL_CDECL_OBJLAST); assert( r >= 0 );
    
    r = m_engine->RegisterObjectProperty("Vector2d", "float x", offsetof(Vector2d,x)); assert( r >= 0 );
    r = m_engine->RegisterObjectProperty("Vector2d", "float y", offsetof(Vector2d,y)); assert( r >= 0 );

    r = m_engine->RegisterObjectMethod("Vector2d", "float length() const", asMETHOD(Vector2d, length), asCALL_THISCALL); assert( r >= 0 );
    r = m_engine->RegisterObjectMethod("Vector2d", "Vector2d normalize() const", asMETHOD(Vector2d, normalize), asCALL_THISCALL); assert( r >= 0 );
    r = m_engine->RegisterObjectMethod("Vector2d", "float distanceTo( const Vector2d@ v ) const", asMETHOD(Vector2d, distanceTo), asCALL_THISCALL); assert( r >= 0 );
    r = m_engine->RegisterObjectMethod("Vector2d", "float dot( const Vector2d@ v ) const", asMETHOD(Vector2d, dot), asCALL_THISCALL); assert( r >= 0 );

But I get the following compiler warning:
Quote:
warning: invalid access to non-static data member 'Vector2d::x' of NULL object warning: (perhaps the 'offsetof' macro was used incorrectly) warning: invalid access to non-static data member 'Vector2d::y' of NULL object warning: (perhaps the 'offsetof' macro was used incorrectly)
Any ideas why this might be?

Share this post


Link to post
Share on other sites
Advertisement
The offsetof() macro that is defined in stddef.h (if I recall correctly) produces some code that GNUC doesn't like very much. It does give the correct result though.

It may have to do with the fact that your class has constructors, which by specifications turns it into a non-pod structure.

There ought to be some other way of determining the offsets, without using the offsetof() macro, but I've never searched for it since the macro is working (albeit with warnings on GNUC).

Share this post


Link to post
Share on other sites
Yep I just did a bunch of reading up on it, it appears you are completely right.

Apparently, as long as it's a simple class, even multiple inheritance is fine, as long as it doesn't have any virtual inheritance. Everything I've read said that every compiler people knew about implemented things so it would still work in this case.

But the spec still allows for some leeway in the memory layout of the class once constructors are introduced, so in theory, a compiler could lay it out in a way that would break this. And that is what GCC is telling me.

Now I just need to find a way to pragma out the warning or something :P

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!