Problem with C functions ?

Поиск
Список
Период
Сортировка
От Manuel Weindorf
Тема Problem with C functions ?
Дата
Msg-id 382ABAB2.3F522C33@ipf.uni-karlsruhe.de
обсуждение исходный текст
Список pgsql-general
Hi there,

I comiled a C-funtion to compute the azimth of a LSEG but the funtion
returns
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 по дате отправления:

Предыдущее
От: Chris Ian Capon Fiel
Дата:
Сообщение: Re: [GENERAL] Re: pgsql-general-digest V1 #523
Следующее
От: Manuel Weindorf
Дата:
Сообщение: Problem with C functions ?