[Coin-discuss] Segmentation fault in CoinPackedMatrix
Matthew Galati
magh at lehigh.edu
Thu Jan 22 10:51:53 EST 2004
I agree. Just the fact that you'd have to scan is a strong enough
argument. I guess I should have read the documentation before trying to
parse the source :)
http://www-124.ibm.com/developerworks/opensource/coin/Doxygen/Coin/class_coin_packed_matrix.html#z143_3
Matt
> It was intentional that the append{Major,Minor}Vector() methods do not accept
> out of range indices. Basically, if they do then if there is an error in the
> input vector (the one to be appended) then the append routines would silently
> "correct" it, i.e., expand the matrix. This is definitely not what you'd want,
> since then bugs would show up a lot later in the run. Not to mention that
> the argument vector is compressed, so if the matrix is to be expanded we
> can't really know what should be the new minor dimension (Though it could
> probably be set safely to the largest index in the argument vector.) So at the
> time we decided that the vector to be appended is assumed to be of the same
> size as the matrix and having out of range indices is an error. Not to mention
> that this way the indices in the vector need not be scanned just to check
> whether the matrix needs to be resized. The scanning is still there, but
> ifdef'd with COIN_DEBUG.
>
> We can change the behavior of the append methods, but I feel the arguments
> above are strong enough to put the user through a bit of inconvenience by
> requesting an explicit resize if the user really wants to append vectors
> longer than the matrix. I believe the code is cleaner this way (including
> the user's code, since the explicit resizing indicates the long
> vector) and more efficient. What do you think?
>
> --Laci
>
> On Thu, 22 Jan 2004, Matthew Galati wrote:
>
>
>>sorry... typo in last post
>>
>>"That is, it does *not* handle the case where the minor... "
>>
>>
>>Matthew Galati wrote:
>>
>>>Looking over appendMajorVector again, I noticed that resize is only
>>>called if the buffer for major dimension (cols) or number of elements is
>>>exceeded. That is, it does handle the case where the minor dimension is
>>>too small - hence, the throw statement. So, for using the append
>>>functions, you do need to setDimensions first. It would be nice to have
>>>a resize that can handle this. But, the current implementation makes
>>>sense (in most cases), since typically you append columns then rows in
>>>sequence. So, in each call to appendCol you are operating on a fixed
>>>size of rows, and the number of columns is incremented. Then, when you
>>>appendRow it has the right number of columns (which is again fixed). If
>>>you do have an application that might add both at the same time, you can
>>>call setDimensions to resize your matrix beforehand.
>>>
>>>Matt
>>>
>>>
>>>
>>>
>>>>Ok. I tried to add the COIN_DEBUG and it actually throws the exception
>>>>if the minor dimension is not set to 2. If I do a
>>>>check.setDimensions(2,0) then it works. As I read the code this must
>>>>always be done? As you note, the only reason for having this throw
>>>>block is a bug in the resize or that it is simply an invariant? And by
>>>>the way the small code snip that I did seems to dump only on Linux and
>>>>not MSV6 while the orginal code dumps on both. Obviously this was
>>>>without COIN_DEBUG defined. The fix for now is to call setDimensions
>>>>which is possible in my application since the number of rows is
>>>>constant. Thanks.
>>>>
>>>>'Jesper
>>>
>>>
>>_______________________________________________
>>Coin-discuss mailing list
>>Coin-discuss at www-124.ibm.com
>>http://www-124.ibm.com/developerworks/oss/mailman/listinfo/coin-discuss
>>
>
>
> _______________________________________________
> Coin-discuss mailing list
> Coin-discuss at www-124.ibm.com
> http://www-124.ibm.com/developerworks/oss/mailman/listinfo/coin-discuss
More information about the Coin-discuss
mailing list