<div dir="ltr"><div class="gmail_default"><font face="verdana, sans-serif">Thanks for the fix in 0.46.7. There are a couple more subtle problems having to do with bounds checking (one of which may be there by design).</font></div><div class="gmail_default"><font face="verdana, sans-serif">Bounds checking occurs in the function array_rangeop_getrange() starting line 536:</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">    firstitem = x->x_onset;<br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><div class="gmail_default">    if (firstitem < 0)</div><div class="gmail_default">        firstitem = 0;</div><div class="gmail_default">    else if (firstitem > a->a_n)</div><div class="gmail_default">        firstitem = a->a_n;</div><div class="gmail_default">    if (x->x_n < 0)</div><div class="gmail_default">        nitem = a->a_n - firstitem;</div><div class="gmail_default">    else</div><div class="gmail_default">    {</div><div class="gmail_default">        nitem = x->x_n;</div><div class="gmail_default">        if (nitem + firstitem > a->a_n)</div><div class="gmail_default">            nitem = a->a_n - firstitem;</div><div class="gmail_default">    }</div><div class="gmail_default"><br></div><div class="gmail_default"><br></div><div class="gmail_default">So unlike tabread which clips indices from 0 to n-1, this clips the onset from 0 to n, which means an onset greater than (n-1) gets a range with 0 items. I think this might be by design, but I wanted to check because a range with 0 items does something funny in the min/max array objects.</div></font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">So first off, in these lines (starting line 746):</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><div class="gmail_default">    for (i = 0, besti = 0, bestf= -1e30, itemp = firstitem;</div><div class="gmail_default">        i < nitem; i++, itemp += stride)</div><div class="gmail_default">            if (*(t_float *)itemp > bestf)</div><div class="gmail_default">                bestf = *(t_float *)itemp, besti = i;</div><div class="gmail_default"><br></div><div class="gmail_default">If the input range has 0 items (i.e. if nitems is set to zero manually, or if the onset is greater than n-1), the for-loop condition i < nitem is never true, so the value output is going to be the bestf init value -1e30 (likewise with +1e30 in the min function). Since this a value that doesn't point to anything in the array, I wonder if it would be better not to output anything (or maybe a bang) in those cases.</div><div class="gmail_default"><br></div></font></div><div class="gmail_default"><span style="font-family:verdana,sans-serif"><br></span></div><div class="gmail_default"><span style="font-family:verdana,sans-serif">Second, the value x->x_rangeop.x_onset is not bounds checked, so when you do this (line 750):</span><br></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><div class="gmail_default">    outlet_float(x->x_out2, besti + x->x_rangeop.x_onset);</div></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif">if x_rangeop.x_onset iss out of range, you're going to output an erroneous index value, which could be negative or greater than n. firstitem is bounds-checked from the onset by array_rangeop_getrange() -- would it be possible to use that instead?</font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif">This suite is really a wonderful addition to Pd, and adds so much new functionality to vanilla.</font></div><div class="gmail_default" style=""><font face="verdana, sans-serif">Many cheers!</font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="verdana, sans-serif">Matt</font></div><div class="gmail_default" style=""><font face="verdana, sans-serif"><br></font></div><div class="gmail_extra"><font face="verdana, sans-serif"><br></font><div class="gmail_quote"><font face="verdana, sans-serif">On Fri, Sep 4, 2015 at 8:11 PM, Miller Puckette <span dir="ltr"><<a href="mailto:msp@ucsd.edu" target="_blank">msp@ucsd.edu</a>></span> wrote:<br></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><font face="verdana, sans-serif">Yep :)<br>
<span class=""><font color="#888888"><br>
M<br>
</font></span></font><div class=""><div class="h5"><font face="verdana, sans-serif"><br>
On Fri, Sep 04, 2015 at 07:46:30PM -0400, Matt Barber wrote:<br>
> Thanks.<br>
><br>
> I meant to say that there was the same problem in [array min], but you<br>
> probably caught it in your fix.<br>
><br>
> Best,<br>
><br>
> Matt<br>
><br>
> On Fri, Sep 4, 2015 at 7:19 PM, Miller Puckette <<a href="mailto:msp@ucsd.edu">msp@ucsd.edu</a>> wrote:<br>
><br>
> > Yep... thanks.  Fixed in git - may take some time for me to get out a new<br>
> > compiled version (other stuff to fix too :)<br>
> ><br>
> > M<br>
> ><br>
> ><br>
> > On Fri, Sep 04, 2015 at 05:51:15PM -0400, Matt Barber wrote:<br>
> > > Hi list,<br>
> > ><br>
> > > I've been playing around with the new(ish) [array] object suite in<br>
> > vanilla<br>
> > > 0.46.6. Forgive me if this is already a known issue, but it looks like<br>
> > the<br>
> > > min and max arguments aren't working properly.<br>
> > ><br>
> > > The second inlet (setting the number of points to search) works as<br>
> > > expected. The first inlet doesn't update: it seems to be set to 0 no<br>
> > matter<br>
> > > what (although the index outlet is updated, but not as expected).<br>
> > ><br>
> > > I think I see the problem in x_array.c<br>
> > ><br>
> > > The max object is defined line 723:<br>
> > ><br>
> > > typedef struct _array_max<br>
> > > {<br>
> > >     t_array_rangeop x_rangeop;<br>
> > >     t_outlet *x_out1;       /* value */<br>
> > >     t_outlet *x_out2;       /* index */<br>
> > >     int x_onset;            /* search onset */<br>
> > > } t_array_max;<br>
> > ><br>
> > ><br>
> > > And the bang and float methods starting 740:<br>
> > ><br>
> > > static void array_max_bang(t_array_max *x)<br>
> > > {<br>
> > >     char *itemp, *firstitem;<br>
> > >     int stride, nitem, i, besti;<br>
> > >     t_float bestf;<br>
> > >     if (!array_rangeop_getrange(&x->x_rangeop, &firstitem, &nitem,<br>
> > &stride))<br>
> > >         return;<br>
> > >     for (i = 0, besti = 0, bestf= -1e30, itemp = firstitem;<br>
> > >         i < nitem; i++, itemp += stride)<br>
> > >             if (*(t_float *)itemp > bestf)<br>
> > >                 bestf = *(t_float *)itemp, besti = i;<br>
> > >     outlet_float(x->x_out2, besti+x->x_onset);<br>
> > >     outlet_float(x->x_out1, bestf);<br>
> > > }<br>
> > ><br>
> > > static void array_max_float(t_array_max *x, t_floatarg f)<br>
> > > {<br>
> > >     x->x_onset = f;<br>
> > >     array_max_bang(x);<br>
> > > }<br>
> > ><br>
> > ><br>
> > > In the float method it looks like the onset is never actually assigned in<br>
> > > the x_rangeop member of the t_array_max struct, so array_rangeop_getrange<br>
> > > can't set the firstitem pointer to anything but its init value.<br>
> > ><br>
> > ><br>
> > > Thanks,<br>
> > ><br>
> > > Matt<br>
> ><br>
> > > _______________________________________________<br>
> > > <a href="mailto:Pd-list@lists.iem.at">Pd-list@lists.iem.at</a> mailing list<br>
> > > UNSUBSCRIBE and account-management -><br>
> > <a href="http://lists.puredata.info/listinfo/pd-list" rel="noreferrer" target="_blank">http://lists.puredata.info/listinfo/pd-list</a><br>
> ><br>
> ><br>
<br>
> _______________________________________________<br>
> <a href="mailto:Pd-list@lists.iem.at">Pd-list@lists.iem.at</a> mailing list<br>
> UNSUBSCRIBE and account-management -> <a href="http://lists.puredata.info/listinfo/pd-list" rel="noreferrer" target="_blank">http://lists.puredata.info/listinfo/pd-list</a><br>
<br>
</font></div></div></blockquote></div><br></div></div>