Lun Sep 01, 2008 3:16 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
| Strings en XS |
|
|
Hola a todos(as).
Tengo una duda un tanto básica sobre XS... resulta que tengo una función ( en xs ) que retorna un string, pero este string no es compatible con los de Perl y no sé cómo pasarlo.
Explico con código:
| c: | int
dispositivo ()
CODE:
{
struct fdev *dev;
struct f_scdv_dev *ddev;
dev = discovered_dev ( ddev );
printf( "Dispocitivo: %s", dev ); // esto es de prueba
RETVAL = dev;
}
OUTPUT:
RETVAL |
Aunque el código está alterado, creo que el problema se ve... RETVAL no es compatible (en este caso) con las variables de Perl.
Leí algo de SV en perlguts, pero no me quedó nada claro... cualquier comentario se agradece.
Ultima edición por creating021 el Sab Sep 06, 2008 5:38 pm, editado 1 vez |
|
|
|

Sab Sep 06, 2008 5:38 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
No es
Es
Se nota que no sé ni las bases de C...  |
|


Vie Sep 19, 2008 3:12 am
|
 |
salva
Perlero Nuevo

|
Registrado: 03 Ene 2008
Mensajes: 14
|
|
|
|
|
Para devolver varios valores, lo mejor es usar la directiva PPCODE dentro de la cual puedes manipular la pila con total libertad.
Por ejemplo, este wrapper, extraído de mi módulo Geo::Coordinates::UTM::XS, devuelve una cadena y dos NVs (doubles):
| Código: |
NO_OUTPUT void
_latlon_to_utm(ename, latitude_deg, longitude_deg)
SV *ename
double latitude_deg
double longitude_deg
PROTOTYPE: $$$
PREINIT:
int zone = 0;
char zone_letter = 0;
double easting, northing;
PPCODE:
_latlon_to_utm(aTHX_ ename, latitude_deg, longitude_deg,
&zone, &zone_letter, &easting, &northing);
XPUSHs(sv_2mortal(newSVpvf("%d%c", zone, zone_letter)));
XPUSHs(sv_2mortal(newSVnv(easting)));
XPUSHs(sv_2mortal(newSVnv(northing)));
XSRETURN(3); |
De todas formas, en tu caso, la parte complicada va a ser cómo pasas la estructura C a Perl.
Si solo contiene datos, lo mas fácil es convertirlo en un hash, pero si es un puntero que tendrás que pasar más adelante de nuevo a alguna otra función, entonces tendrás que usar un typemap para envolverlo en un objeto
También puedes devolver el puntero como un entero, pero es una práctica peligrosa, similar a usar punteros void* en C porque no tendrás ningún chequeo de tipos.
¡No debes olvidarte tampoco de la gestión de memoria! |
|

Vie Sep 19, 2008 4:55 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
Muchas gracias por el comentario, salva  |
|
Powered by phpBB © 2001, 2005 phpBB Group
|