Shared (static/global) attributes

Jul 13, 2012 at 12:22pm

Shared (static/global) attributes

Hi there,

I am in need of creating an attribute whose value is shared among all the instances of the same class.
To this end, next to my class pointer, I declare a global variable to hold the attribute value:

t_class *s_myobj_class;    // whatever...
long s_myattr_val;

In main I write the following code:

STATIC_ATTR_LONG(c, "attrname", ATTR_FLAGS_NONE, s_myattr_val);

This works to some extent, meaning that I do see the newly created attribute in the object’s inspector and the attribute’s value is indeed shared by all instances of the class. The problem is that the value is not assigned to my global variable (s_myattr_val), and I don’t know where the value that Max references is. Needless to say, I cannot retrieve it to use it in my code.

I am using the STATIC_ATTR_LONG macro to create the attribute as it’s suggested by the API, however (and here might very well be my mistake) the ext_obex_utils.h file says that the attribute value should be passed as “Pointer to the value”.

I tried declaring my attribute as such:

long *s_myattr_val;

and even this:

long s_myattr_val;
STATIC_ATTR_LONG(c, "attrname", ATTR_FLAGS_NONE, &s_myattr_val);

but the behavior is the same.
I am compiling on Xcode 4.3, Max 6.0.4 SDK.

Thanks for any insight.

- Luigi

#35928
Jul 14, 2012 at 12:03pm

Hi Luigi,

without trying it out, just an idea. Did you try this?

long s_myattr_val;

// Blah.... blah.... blah....

STATIC_ATTR_LONG(c, "attrname", ATTR_FLAGS_NONE, &s_myattr_val);

I’m not sure it would work, but maybe yes…

Best,
Ádám

#123077
Jul 14, 2012 at 5:38pm

If you had read my post until the end you would know I did try that, but to no success…
Thanks for the suggestion anyway.

- Luigi

#123078
Jul 14, 2012 at 5:45pm

Sorry. My eyes somehow messed up your last line with the long* declaration before it…

Ádám

#123079
Jul 17, 2012 at 3:53pm

A search of all our source code indicates that the STATIC_ATTR_* macros are not used anywhere in Max. While this is further researched I’d recommend that you use a custom setter and getter for the attribute.

Cheers,
Tim

#123080
Jul 17, 2012 at 6:47pm

Yes, using a custom getter and setter ought to do the trick, however – after further investigation – I did manage to solve the issue in a slightly different manner. It just so happens that if you use object_attr_getlong() and object_attr_setlong() to get/set the value of the attribute everything works as expected.
This tells me that Max already stores the global value somewhere internally without needing to be supplied one.
So without using any STATIC_ATTR_ macro I am creating the attribute as follows:

t_object *attr;
attr = attribute_new("attrname", _sym_long, ATTR_FLAGS_NONE, (method)0L, (method)0L);
class_addattr(c, attr);

in order to set and retrieve the attribute’s value:

long attrval;
object_attr_setlong(x, gensym("attrname"), 74);
attrval = object_attr_getlong(x, gensym("attrname"));

This makes sense thinking that attributes work by calculating memory offsets into the object’s data structure.
As far as I know, it is impossible to calculate an address offset for variables globally/statically declared because there’s no reference struct.

- Luigi

#123081

You must be logged in to reply to this topic.