On Fri, 12 Nov 1999, Manuel Weindorf wrote:
> Hi there,
>
> I compiled a C-funtion to compute the azimuth of a LSEG but the function
> never
> returns the correct value, but elog( ... ) report the correct value.
> So there seems to be a problem returning doubles or floats ??
>
> compile the folling function with
> gcc -fPIC -O2 -shared -o lseg_azimuth.o -c lseg_azimuth.c
> -I/opt/local/postgres/include -L/opt/local/postgres/lib
> ld -G -Bdynamic -o libgeom.so lseg_azimuth.o
>
> #include <math.h>
>
> #include "postgres.h"
> #include "utils/geo_decls.h"
>
> double lseg_azimuth( LSEG* lseg );
> float add_one( float arg );
>
> double lseg_azimuth( LSEG* lseg )
> {
> double x1, y1;
> double x2, y2;
> double ori;
>
> x1 = lseg->p[0].x;
> y1 = lseg->p[0].y;
>
> x2 = lseg->p[1].x;
> y2 = lseg->p[1].y;
>
> ori = atan2( (x2-x1), (y2-y1));
> ori = (ori / M_PI) * 200.0;
>
> if ( ori < 0.0 )
> ori += 400.0;
>
> elog( NOTICE, "ori = %8.3lf", ori );
>
> return( ori );
> }
(See in PgSQL source code src/backend/utils/adt/ and geo routines).
Try this:
double*
lseg_azimuth( LSEG* lseg )
{double *result = (double) palloc(sizeof(double));
......
*result = any_value;
......return result;
} Karel
------------------------------------------------------------------------------
Karel Zak <zakkr@zf.jcu.cz> http://home.zf.jcu.cz/~zakkr/
Docs: http://docs.linux.cz (big docs archive)
Kim Project: http://home.zf.jcu.cz/~zakkr/kim/ (process manager)
FTP: ftp://ftp2.zf.jcu.cz/users/zakkr/ (C/ncurses/PgSQL)
------------------------------------------------------------------------------