2012-07-22 13 views
5

So quasi che nessun C++ non aiuta, e il mio XS non è molto meglio. Sto creando un'interfaccia XS per una libreria C++ e ho quasi tutti i miei metodi di lavoro tranne uno.Perl XS e C++ passano il puntatore al buffer

Il metodo in Perl dovrebbe assomigliare a questo:

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

Il metodo viene definito come questo file h:

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

"Buffer" andranno assegnati se è passata in NULL .

Esistono due versioni aggiuntive di readPath con diverse firme, ma non sono quelle che desidero. (E, cosa interessante, quando provo a compilare mi dice che i "candidati" sono i due che non voglio.) È perché non sta capendo il "char * &"?

Qualcuno può aiutare con lo xsub che devo scrivere?

Sono su Perl 5.14.2.

BTW - Ho anche utilizzato una typemap "long long int" su T_IV. Non riesco a trovare alcuna documentazione su come digitare typemap correttamente a lungo. Qualche suggerimento su come dovrei scrivere per lungo?

Grazie,

risposta

3

non ho mai affrontato con C++ da C o XS. Se fosse C, sarebbe:

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); 
     } 

Speriamo che funzioni o che sia possibile regolarlo per funzionare.


ho pensato:

  • readPath ritorna vero/falso per il successo/insuccesso.
  • buffer non assegnato in caso di errore.
  • Lo deallocator per buffer è free.
+1

La parte della risposta che ho risolto per me era capire che non avevo bisogno di usare la struttura C++ XS - Class :: method (...) - in xsub. Ho continuato a cercare una firma che XS avrebbe accettato, ma una volta eliminata la questione è stata molto più facile da risolvere. Grazie. – user1446426

Problemi correlati