*char and *t_symbol confusion


    Oct 14 2006 | 10:34 am
    I have a t_symbol *prefix, member of my object struct and set by an argument in my *new function :
    if ( (ac==1) && (av->a_type == A_SYM) ) { x->prefix = av->a_w.w_sym; if (debug) post("prefix :%s", x->prefix->s_name); }
    Ok. Then i have a t_symbol *target, also member of my struct, which i try to be set dynamically when a list is received. The first int of the list should be concatenated (?) with the prefix to become a receiver's name. I do :
    char *temp = (char *) malloc(sizeof(x->prefix)+ sizeof(int)); sprintf(temp, "%s%d", x->prefix->s_name, av+0); x->target = gensym(temp); free(temp); // BTW, if you think it's dirty, you can give me a better way ;-) if (debug) post("List sent to %s", x->target->s_name);
    and i know it's not good 'cause i'm messing *char & *t_symbol...
    Any help ?
    cheers
    f.e
    -- f.e chanfrault | aka | personal computer music > >>>>>> http://www.personal-computer-music.com > >>>>>> |sublime music for a desperate people|

    • Oct 14 2006 | 10:41 am
      Sorry mates, the problem was the av type, not the chars or symbols :
      sprintf(temp, "%s%d", x->prefix->s_name, av->a_w.w_long);
      But still wanting any better ideas about my pointers dirtyness...
      cheers
      f.e
      f.e chanfrault | aka | personal computer music > >>>>>> http://www.personal-computer-music.com > >>>>>> |sublime music for a desperate people|
      f.e wrote: > I have a t_symbol *prefix, member of my object struct and set by an > argument in my *new function : > > if ( (ac==1) && (av->a_type == A_SYM) ) > { > x->prefix = av->a_w.w_sym; > if (debug) post("prefix :%s", x->prefix->s_name); > } > > Ok. Then i have a t_symbol *target, also member of my struct, which i > try to be set dynamically when a list is received. The first int of > the list should be concatenated (?) with the prefix to become a > receiver's name. I do : > > char *temp = (char *) malloc(sizeof(x->prefix)+ sizeof(int)); > sprintf(temp, "%s%d", x->prefix->s_name, av+0); > x->target = gensym(temp); > free(temp); // BTW, if you think it's dirty, you can give me a better > way ;-) > if (debug) post("List sent to %s", x->target->s_name); > > and i know it's not good 'cause i'm messing *char & *t_symbol... > > Any help ? > > cheers > > f.e >
    • Oct 14 2006 | 10:48 am
      f.e wrote:
      > I have a t_symbol *prefix, member of my object struct and set by an > argument in my *new function : > > if ( (ac==1) && (av->a_type == A_SYM) ) > { > x->prefix = av->a_w.w_sym; > if (debug) post("prefix :%s", x->prefix->s_name); > } > > Ok. Then i have a t_symbol *target, also member of my struct, which i > try to be set dynamically when a list is received. The first int of the > list should be concatenated (?) with the prefix to become a receiver's > name. I do : > > char *temp = (char *) malloc(sizeof(x->prefix)+ sizeof(int));
      If you want to append an integer number (i.e. '23' or '173') to a string, the above code is wrong, because you alloc memory for sizeof(int) for your number (which shoule work for up to 4 digits, but not with more)! The real size (in char) depends on the value and you don't the final value know until you have converted into to char*.
      I would probably do something like that:
      char num[32]; // lets assume that ints don't have more than 32 digits sprintf(num, "%d", (int)argv[0].a_w.w_long); char *temp = (char *)malloc((strlen(x->prefix) + strlen(num)) * sizeof(char));
      > sprintf(temp, "%s%d", x->prefix->s_name, av+0);
      Maybe use strcpy() here, since you now have num already.
      hope this helps, Olaf
    • Oct 14 2006 | 10:51 am
      Hey, great ! That's safer, for sure. Thanks Olaf
      f.e
      f.e chanfrault | aka | personal computer music > >>>>>> http://www.personal-computer-music.com > >>>>>> |sublime music for a desperate people|
      Olaf Matthes wrote: > f.e wrote: > >> I have a t_symbol *prefix, member of my object struct and set by an >> argument in my *new function : >> >> if ( (ac==1) && (av->a_type == A_SYM) ) >> { >> x->prefix = av->a_w.w_sym; >> if (debug) post("prefix :%s", x->prefix->s_name); >> } >> >> Ok. Then i have a t_symbol *target, also member of my struct, which i >> try to be set dynamically when a list is received. The first int of >> the list should be concatenated (?) with the prefix to become a >> receiver's name. I do : >> >> char *temp = (char *) malloc(sizeof(x->prefix)+ sizeof(int)); > > If you want to append an integer number (i.e. '23' or '173') to a > string, the above code is wrong, because you alloc memory for > sizeof(int) for your number (which shoule work for up to 4 digits, but > not with more)! The real size (in char) depends on the value and you > don't the final value know until you have converted into to char*. > > I would probably do something like that: > > char num[32]; // lets assume that ints don't have more than 32 digits > sprintf(num, "%d", (int)argv[0].a_w.w_long); > char *temp = (char *)malloc((strlen(x->prefix) + strlen(num)) * > sizeof(char)); > >> sprintf(temp, "%s%d", x->prefix->s_name, av+0); > > Maybe use strcpy() here, since you now have num already. > > hope this helps, > Olaf >