problem with function arguments

May 26, 2008 at 11:04am

problem with function arguments

Why

void sdmain_debug(t_sdmain *x, int i)
{
if (!i) debug = 0; else debug = 1;
}

works (i is taken as it should be)

while

void sdmain_mouse (t_sdmain *x, int mx, int my, short but, short ctrl,
short shift, short caps, short alt, short rclick)
{

if ((!but) && (!shift) && (!caps) && (!rclick))
{
identify(x, mx, my);
}

post(“mouse : %d %d %d %d %d %d %d %d”, mx, my, but, ctrl, shift, caps,
alt, rclick); // for debug only
}

doesn’t ?

I can see in the Max console that it’s giving me the adresses instead of
treating the arguments as they should be. Do i *really* have to do a
bloody int ac, Atom *av thing with

int mx = av[0].a_w.w_long; and so on, while i already know exactly what
kind of arguments i’ll get ?

Best

f.e


f.e chanfrault | aka | personal computer music
>>>>>>> http://www.personal-computer-music.com
>>>>>>> | film soundtracks, sound art, music |

#38059
May 26, 2008 at 12:07pm

Are these methods called directly from the max interface / patcher? If so,
change all of your arguments to long. Max doesn’t deal with int and short,
only long, double, and symbol (for messages). That would explain why the
first method works and the second doesn’t. In the first max would pass a
long which you treat like an int (without casting). If its set to zero, it
would still be zero as an int. In your second method your arguments would be
completely screwed for that reason.

Btw if you do deal with atoms, they’re not that bad once you use the
functions like:

long mx = atom_getlong(av);
long my = atom_getlong(av+1);
etc

Cheers,
Thijs

On Mon, May 26, 2008 at 12:04 PM, f.e

wrote:

> Why
>
> void sdmain_debug(t_sdmain *x, int i)
> {
> if (!i) debug = 0; else debug = 1;
> }
>
> works (i is taken as it should be)
>
> while
>
> void sdmain_mouse (t_sdmain *x, int mx, int my, short but, short ctrl,
> short shift, short caps, short alt, short rclick)
> {
>
> if ((!but) && (!shift) && (!caps) && (!rclick))
> {
> identify(x, mx, my);
> }
>
> post(“mouse : %d %d %d %d %d %d %d %d”, mx, my, but, ctrl, shift, caps,
> alt, rclick); // for debug only
> }
>
> doesn’t ?
>
> I can see in the Max console that it’s giving me the adresses instead of
> treating the arguments as they should be. Do i *really* have to do a bloody
> int ac, Atom *av thing with
>
> int mx = av[0].a_w.w_long; and so on, while i already know exactly what
> kind of arguments i’ll get ?
>
> Best
>
> f.e
>
> –
> f.e chanfrault | aka | personal computer music
> >>>>>>> http://www.personal-computer-music.com
> >>>>>>> | film soundtracks, sound art, music |
>

#131971
May 28, 2008 at 11:08am

#131972
May 28, 2008 at 11:46am

#131973
May 28, 2008 at 12:22pm

f.e wrote:
> I know how to easily deal with this using an ac/av atoms thing, but i
> really want to understand why is it so hard to use arguments you know
> the type and the length in a function.

Because it’s too many of them. I don’t remember correctly, but I think
there is an upper limit of the number of arguments you can use and/or
there is a rule how to order them. I’m not 100% sure how to do it
correctly because in such a case I always use the t_atom to avoid the
trouble.

Olaf

#131974
May 28, 2008 at 12:41pm

#131975
May 28, 2008 at 12:42pm

On Wed, May 28, 2008 at 1:22 PM, Olaf Matthes

wrote:

> f.e wrote:
>
>> I know how to easily deal with this using an ac/av atoms thing, but i
>> really want to understand why is it so hard to use arguments you know the
>> type and the length in a function.
>>
>
> Because it’s too many of them. I don’t remember correctly, but I think
> there is an upper limit of the number of arguments you can use and/or there
> is a rule how to order them. I’m not 100% sure how to do it correctly
> because in such a case I always use the t_atom to avoid the trouble.
>

You’re right, I think the limit is 7.

> When i set it to
>
> addmess((method) sdmain_mouse, “mouse”, A_GIMME, 0);
>
> all values are wrong in the max console…
>
>
Did you change the arguments of your method to : “MyObject *x, t_symbol *s,
long ac, t_atom *av” ? If your data looks wrong in the max console, you’re
probably not parsing the atoms correctly. If you post the code we can
probably help…

Thijs

#131976
May 28, 2008 at 2:04pm

The limit *is* seven.

It’s in the SDK docs and there’s a #define MAXARGS.

Use A_GIMME to support longer parameter lists.

#131977

You must be logged in to reply to this topic.