Hi !

I am trying to write an xs interface to an external
library and, since I am learning Perl only for 2
weeks, I have serious problems. I'll be so happy il
somebody could help me ! ! ;-)

Here are my main problems (except my english is so
bad !)

In the .h (see below), some C structures are defined.
In Perl, I'll use hash tables. In .xs, I've tried to
copy the Perl hash table in C structures in order to
call the C function, and then to copy back the result
in hash tables.
But, when I print the result, I haven't the same
results for the parameters I wrote in Perl and the
parameters passed in the C function ! See inside the
code for more explanations..

I hope you'll help me and tell what is wrong with my
code ! If you don't understand my problem, just ask me
and I'll try to explain better.

Thanks.

Isabelle.

----------�  Here is my .h :

typedef double Float64;

typedef enum {.
} ConvResultT;

typedef struct {
    Float64 x ;
    Float64 y;
} StereographicCoordinatesT;

typedef struct {
  Float64 latitude;
  Float64 longitude;
} GeographicCoordinateT;

ConvResultT StereoToGeoCoordinates (
       StereographicCoordinatesT *stereo_coordinate_p,
       GeographicCoordinateT   
*geographic_coordinate_p);

/* stereo_coordinate_p is data in,
geographic_coordinate_p is data out*/

----------� Here is what I'd like to write in Perl

$stereo = {x=>4.2, y=>6.5};
$geo = StereoToGeoCoordinates($stereo) ;
/* or StereoToGeoCoordinates($stereo,$geo) ;
print " geo : latitude = $geo->latitude, longitude =
$geo->longitude\n " ;

----------�Here is what I wrote in my .xs

double
getDouble(HV *hv, char *field) {
    SV **svv = hv_fetch(hv, field,
strlen(field),FALSE);
    SV *sv = *svv;
    double res;
    if (svv){
      if (SvOK(sv)){
return = SvNV(sv);
}
      else{
/*undef value*/
croak("Undef value\n");
      }
    }
    else {
      croak("No such arg in hvfetch\n");
}
}

void setDouble(HV *hv,char *field, double val) {
  SV **svv = hv_fetch(hv, field, strlen(field),TRUE);
    if (svv){
      sv_setnv(*svv,val);
         }
    else {
      croak("No such arg in hvfetch\n");
}
}
 
MODULE = Util PACKAGE = Util

void
StereoToGeoCoordinates(rv_stereo,rv_geo)
        SV *rv_stereo
        SV *rv_geo = NO_INIT
PREINIT:
  StereographicCoordinatesT  stereo;
  GeographicCoordinateT  geo;
CODE:
  if (SvROK(rv_stereo) && (SvTYPE(SvRV(rv_stereo)) ==
SVt_PVHV)) {
  
    HV *hv_stereo = (HV*)SvRV(rv_stereo);
    HV *hv_geo;

    /* Copy perl hash to C structure */

    stereo.x = getDouble(hv_stereo,"x");
    stereo.y = getDouble(hv_stereo,"y");
    /*Here, when I print the result of getDouble, I
have something which looks like an address, */
    /*when I print stereo.x, it's 0!!!!!*/  

    /*C function call --will write results in geo
structure */

    StereoToGeoCoordinates(&stereo,&geo);

    /*Copy data back into perl structures*/
   
    setDouble(hv_geo,"latitude",geo.latitude);
    setDouble(hv_geo,"longitude",geo.longitude);
    
    rv_geo = newRV_inc((SV*)hv_geo);
  }
  else croak("arg not a hash ref\n");
OUTPUT:
  rv_geo

___________________________________________________________

Reply via email to