Problem with C functions ?
От | Manuel Weindorf |
---|---|
Тема | Problem with C functions ? |
Дата | |
Msg-id | 382AC753.505410CE@ipf.uni-karlsruhe.de обсуждение исходный текст |
Ответы |
Re: [GENERAL] Problem with C functions ?
|
Список | pgsql-general |
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 ); } then use: create function lseg_azimuth(lseg) returns float8 as ' ... path to the shared lib you just created ...' language 'c'; create table xxx (geometry lseg); insert into xxx (geometry) values ('[(4148.675,5414.255),(4151.405,5414.255)]'); select lseg_azimuth(geometry) from xxx; will return: NOTICE: ori = 100.000 lseg_azimuth ------------ 4148.675 (1 row) But that's obviously not what it should be ... Maybe you have any suggestions ? many thanks Manuel -- Manuel Weindorf (weindorf@ipf.bau-verm.uni-karlsruhe.de) Institut fuer Photogrammetrie und Fernerkundung, Universitaet Karlsruhe Postfach 6980 D-76128 Karlsruhe Tel. +49721 6086010 Fax +49721 694568 http://www-ipf.bau-verm.uni-karlsruhe.de
В списке pgsql-general по дате отправления: