2012-07-22 8 views
5

Casi no conozco C++, así que eso no ayuda, y mi XS no es mucho mejor. Estoy creando una interfaz XS para una biblioteca C++ y tengo casi todos mis métodos funcionando, excepto uno.Perl XS y C++ pasando el puntero al almacenamiento intermedio

El método en Perl debe tener este aspecto:

$return_data = $obj->readPath($path); 

El método se define como esta el archivo .h:

int readPath(const char* path, char* &buffer, bool flag=true); 

El "buffer" va a quedar asignado si es aprobada en NULL .

Hay dos versiones adicionales de readPath con diferentes firmas, pero no son las que yo quiero. (Y curiosamente, cuando intento compilarlo, me dice que los "candidatos" son los dos que no quiero). ¿Es eso porque no está entendiendo el "char * &"?

¿Alguien me puede ayudar con el xsub? Necesito escribir?

Estoy en Perl 5.14.2.

BTW - También he usado un mapa de tipos "long long int" para T_IV. No encuentro ninguna documentación sobre cómo escribir correctamente el mapa de larga duración. ¿Alguna sugerencia de cómo debería escribir el mapa mucho tiempo?

Gracias,

Respuesta

3

Nunca he tratado con C++ de C o XS. Si fuera C, sería:

void 
readPath(SV* sv_path) 
    PPCODE: 
     { 
     char* path = SvPVbyte_nolen(sv_path, len); 
     char* buffer = NULL; 

     if (!readPath(path, &buffer, 0)) 
      XSRETURN_UNDEF; 

     ST(0) = sv_2mortal(newSVpv(buffer, 0)); 
     free(buffer); 

     XSRETURN(1); 
     } 

Afortunadamente, eso funciona o puede ajustarlo para que funcione.


que supone:

  • readPath vuelve verdadero/falso para el éxito/fracaso.
  • buffer no está asignado en caso de error.
  • El deallocator para buffer es free.
+1

La parte de su respuesta que me solucionó esto fue entender que no necesitaba usar la estructura de C++ XS - Class :: method (...) - en el xsub. Seguí intentando encontrar una firma que XS aceptaría, pero una vez que la eliminé fue mucho más fácil de resolver. Gracias. – user1446426

Cuestiones relacionadas