2012-04-04 16 views
6

Non posso dire se questo è un bug o cosa.Come posso passare un array da perl a C++ in linea?

Il seguente codice funziona con Inline::C ma non Inline::CPP

#!/usr/bin/perl 
use warnings; 
use Inline C; 

my @array = (1..10); 
print findAvLen(\@array), "\n"; 

__END__ 
__C__ 

int findAvLen(AV* arrayIn) { 
    return av_len(arrayIn); 
} 

Le piste di cui sopra bene, ma sostituire C con CPP, e ottengo l'errore Can't locate auto/main/findAvLen.al in @INC... codice

posso avere altra linea C++ a lavorare . È possibile, ad esempio, passare un elenco di variabili al codice inline con i puntini di sospensione come fanno in this example, ma mi chiedo perché AV * non funzioni! Per esempio, voglio utilizzare una subroutine per convertire le matrici perl passate a C++ in vettori, ad es. void perl2vector(AV* ar, std::vector<T> &v) {...}, piuttosto che inserire codice per eseguire tale conversione in ogni funzione C++ che scrivo che richiede un argomento array. Come potrei usare la sintassi di quell'esempio per passare l'array perl a un simile convertitore?


Questo sembra essere un bug, ma nel frattempo, UESP ha trovato una soluzione:

int findAvLen(SV* arrRef) { 
    AV * arr = MUTABLE_AV(SvRV(arrRef)); 
    return av_len(arr); 
} 

arr è ora equivalente al arrayIn desiderata nel codice di esempio di cui sopra.

+2

Funziona bene per me: Perl 5.14.0 i686-linux-thread-multi, Inline 0.5, Inline :: CPP 0.38. Sembra un bug corretto, come ha detto uesp, anche se sembra che tutto ciò che devi fare sia aggiornare Inline :: CPP (non Perl) alla versione 0.29 o successiva. – ikegami

+0

hrmm, sto usando perl v5.12.3 con Inline :: CPP v0.38. Cercherò di aggiornare il perl e vedere se questo aiuta. – flies

+0

Ho un'altra scatola con perl v5.12.4 e ho ottenuto lo stesso errore. Sto parlando con il sysadmin ... – flies

risposta

4

Questo sembra essere identico a this Perl bug che esiste in 5.10.0 e avrebbe dovuto essere corretto nella versione 5.10.29. Se esegui 5.10.0-28 prova ad aggiornare. Se non si stanno eseguendo queste versioni e si continua a ricevere l'errore, è possibile provare a fare quanto indicato in this forum post modificando lo AV in SV.

+0

Sono attualmente in esecuzione perl v5.12.3 – flies

+0

Prova a fare un test usando 'SV' e vedi se questo funziona per te. In caso contrario, o altre banali funzioni C++ di test, si verifica un errore simile, quindi è un altro problema. – uesp

+0

'int f (SV * arrayIn) {return 1; } 'funziona, ma non sono sicuro di come usare SV per accedere a un array (ho usato Inline :: C prima, ma mai xs, quindi la mia esperienza è limitata). Sto leggendo perlguts ... – flies

Problemi correlati