kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #07114
Re: Compile error on math_for_graphics.cpp
Lorenzo,
There was macro 'abs' defined somewhere in kicad headers so code with abs
worked. Then I replaced all 'double' abs I found to fabs and deleted the
macro, leaving only ABS. This was done to overload abs(LENGTH).
Obviously one can overload abs(double) too, so there would be no difference.
В сообщении от Понедельник 21 ноября 2011 12:02:11 автор Lorenzo Marcantonio
написал:
> While checking the gencad patch I remembered a thing...
>
> Maybe it's a compiler nuisance (gcc 4.6.1) but I get the following:
>
> /home/mrclnz/cvswork/kicad-vnd/polygon/math_for_graphics.cpp: In function
> ‘double GetPointToLineDistance(double, double, int, int, double*,
> double*)’:
> /home/mrclnz/cvswork/kicad-vnd/polygon/math_for_graphics.cpp:934:23:
> error: call of overloaded ‘abs(double)’ is ambiguous
> /home/mrclnz/cvswork/kicad-vnd/polygon/math_for_graphics.cpp:934:23: note:
> candidates are: /usr/include/stdlib.h:771:12: note: int abs(int)
> /usr/stow/gcc-4.6.1/bin/../lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../incl
> ude/c++/4.6.1/cstdlib:173:3: note: long long int __gnu_cxx::abs(long long
> int)
> /usr/stow/gcc-4.6.1/bin/../lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../inc
> lude/c++/4.6.1/cstdlib:139:3: note: long int std::abs(long int)
>
> (and another couple similar messages on the same file)
>
> IMHO it is correct since abs is for ints and these function take
> doubles...
>
> Trivially fixed like this:
>
>
> === modified file 'polygon/math_for_graphics.cpp'
> --- polygon/math_for_graphics.cpp 2011-06-07 15:29:01 +0000
> +++ polygon/math_for_graphics.cpp 2011-11-21 07:58:04 +0000
> @@ -332,7 +332,7 @@
> else
> {
> if( dist )
> - *dist = min( abs(a-xi), abs(a-xf) );
> + *dist = min( fabs(a-xi), fabs(a-xf) );
> return 0;
> }
> }
> @@ -931,7 +931,7 @@
> *xpp = a;
> *ypp = y;
> }
> - return abs(a-x);
> + return fabs(a-x);
> }
> // find c,d such that (x,y) lies on y = c + dx where d=(-1/b)
> double d = -1.0/b;
> @@ -1020,6 +1020,10 @@
> {
> double d;
> d = sqrt( (double)(x1-x2)*(x1-x2) + (double)(y1-y2)*(y1-y2) );
> + if( isnan( d ) ) // This would be a *massive* loss of precision, but
> can happen + {
> + return 0;
> + }
> if( d > INT_MAX || d < INT_MIN )
> {
> wxASSERT(0);
>
> fabs is the useful alternative for abs using floating point,
> obviously...
>
> Actually I don't remember WHY I added the last part (it was something
> like tracks very near which degenerated to e-39 numbers or something
> like that)
--
--- KeyFP: DC07 D4C3 BB33 E596 CF5E CEF9 D4E3 B618 65BA 2B61
References