• Publicidad

Strings en XS

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Strings en XS

Notapor creating021 » 2008-09-01 16:16 @720

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
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
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.
Última edición por creating021 el 2008-09-06 18:38 @818, editado 1 vez en total
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Notapor creating021 » 2008-09-06 18:38 @818

No es
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
int
dispositivo ()
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Es
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
char *
dispositivo ()
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Se nota que no sé ni las bases de C... :lol:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor creating021 » 2008-09-15 16:11 @716

Bueno ahora... digamos que tengo algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
char *
MySubfuncion ()
    CODE:
    {
        char *texto = "Hola mundo";
        struct dato_unico *dato;
        ST(0) = ( sv_2mortal( newSVpv(texto, strlen(texto) ) ) );
    }
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Eso retorna a un string el texto Hola mundo, pero yo necesito retornar el texto y el dato.
¿Cómo puedo hacer eso?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor salva » 2008-09-19 04:12 @217

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: Seleccionar todo
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!
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Notapor creating021 » 2008-09-19 17:55 @788

Muchas gracias por el comentario, salva :D
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados