Come posso accedere al modello di elenco del programma C ++ da Perl usando SWIG?

StackOverflow https://stackoverflow.com/questions/1443576

  •  22-07-2019
  •  | 
  •  

Domanda

Voglio accedere a un elenco di modelli di programma C ++ da uno script Perl e utilizzare questi valori.

Codice di esempio:

typedef list < Struct1  * > sturct1_list;

struct Struct2
{
    int i;
    struct1_list List1;
}

struct Struct1
{
    int j;
}

Ho usato un aig generato api e ho fatto quanto segue:

$myList = Struct2_struct1List_get 
print "Reference type: " . ref($myList) ;

ora questo viene stampato come:

Reference type:  \_p\_std\_\_listTutils\_\_Struct1\_p\_t 

come ottenere i valori dalla struttura usando questo?

Aggiornamento da una domanda duplicata:

nel file di interfaccia che ho inserito

%template(ListStruct1) std::list< Struct1 * >;

dopo aver generato il " .pm " file. Ho controllato le API disponibili in questo elenco.

Ho trovato

ListStuct1_size
ListStuct1_empty
ListStuct1_clear
ListStuct1_push.

Sono stato in grado di usare quegli elementi. Ma non so come accedere ai singoli elementi dell'elenco usando queste API? o mi sto perdendo qualcosa nel file di interfaccia?

AGGIORNAMENTO:

È possibile utilizzare la typemap per restituire l'elenco come array qui ??

È stato utile?

Soluzione

Prima di tutto, informazioni generali

Questo tutorial mostra come eseguire il wrapper per i modelli.

Lo stesso tutorial mostra come usare il modulo da Perl, ma l'esempio perl non tocca i template.

Questo articolo SO mostra come per farlo con un vettore

Ecco una documentazione generale SWIG STL che sembra menzionare < em> std_list.i interfaccia.

Secondo, per quanto riguarda gli elenchi

  1. Non puoi " accedere a " Elenco C ++ come un array Perl, in base a un indice. Se lo desideri, devi utilizzare un vettore come tipo sottostante.

  2. In alternativa, crea un elenco che estende la classe, dagli un nuovo metodo che restituisce un elemento tramite un indice ed esponi quel metodo in un'interfaccia.

  3. Se si desidera accedere all'elenco trovando un elemento, come in C ++, è necessario scrivere un'interfaccia Elenco che espone il metodo find () - quello predefinito non legge il codice sorgente.

Altri suggerimenti

Nella tua interfaccia, prova:

%include "std_list.i"

%template(ListStruct1) std::list< Struct1 * >;

La libreria std è un po 'divertente, non esiste un vero oggetto binario chiamato list che il swig può semplicemente avvolgere, sono tutti modelli - quindi il swig ha bisogno di un aiuto extra per capire cosa sta succedendo.

Ciò dovrebbe aggiungere l'inserimento, la rimozione e un mucchio di altre funzioni specifiche dell'elenco al wrapper.

Se quanto sopra non funziona, prova ad aggiungere:

%define SWIG_EXPORT_ITERATOR_METHODS 

AGGIORNAMENTO: Naturalmente, ho trascurato di menzionare (o persino rendermi conto) che questo funziona alla grande per Python, Java e pochi altri, ma è totalmente rotto in Perl ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top