Hi Neil,

Neil Williams schrieb:
On Monday 13 February 2006 2:08 am, Derek Atkins wrote:

Quoting Neil Williams <[EMAIL PROTECTED]>:

_C (double eint, double pmt, unsigned beg)
{
-  return pmt * _B (eint, beg);
+  unsigned check = _B (eint, beg);

I'm not convinced this patch is correct.  _B() returns a double,

I'm setting up an error state that is perpetuated through the code.

Oh no. This means you are using the code pattern "one special calculation return value corresponds to an error value". This code pattern should better be avoided, if at all possible. In this fin.c case, I don't understand why a different solution isn't possible -- the _B() function makes a divide-by-"eint", so it is perfectly fine to add an assertion "assert(eint!=0.0)" there, and require all places that call _B() to not pass an eint==0.0.

Since _B() is only called from two other places, it shouldn't be difficult at all to add those required checks *before* calling _B(). There is really no need to check for this "special error value" afterwards -- simply check for eint==0.0 *before* and all is fine, and (even more important) everyone will understand this. Either way, you have to check for that condition, but checking up front is far more understandable and avoids any data type casts.

The calling function _C() obviously will then have the restriction that eint must be nonzero as well, and it is called a few more times, but it shouldn't be too difficult to add these checks to all calling places as well. Please replace your "returned special error code" by a check for nonzero-ness up front.

Christian

_______________________________________________
gnucash-devel mailing list
[email protected]
https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to