Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Strings en XS

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Lun Sep 01, 2008 3:16 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Strings en XS Responder citando

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
Mensaje Sab Sep 06, 2008 5:38 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

No es
c:
int
dispositivo ()

Es
c:
char *
dispositivo ()


Se nota que no sé ni las bases de C... Laughing
Mensaje Lun Sep 15, 2008 3:11 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Bueno ahora... digamos que tengo algo como esto:
c:
char *
MySubfuncion ()
    CODE:
    {
        char *texto = "Hola mundo";
        struct dato_unico *dato;
        ST(0) = ( sv_2mortal( newSVpv(texto, strlen(texto) ) ) );
    }

Eso retorna a un string el texto Hola mundo, pero yo necesito retornar el texto y el dato.
¿Cómo puedo hacer eso?
Mensaje Vie Sep 19, 2008 3:12 am
salva
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Ene 2008
Mensajes: 14
Responder citando

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!
Mensaje Vie Sep 19, 2008 4:55 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Muchas gracias por el comentario, salva Very Happy
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group