2012-04-04 31 views
6

Nie mogę stwierdzić, czy to błąd, czy co.Jak mogę przekazać tablicę z perla do wbudowanego C++?

Poniższy kod działa z Inline::C ale nie 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); 
} 

Powyższe działa dobrze, ale zastąpić C z CPP, i pojawia się błąd Can't locate auto/main/findAvLen.al in @INC...

mogę dostać drugą inline kodu C++ do pracy . Możliwe jest na przykład przekazanie listy zmiennych do kodu śródliniowego z wielokropkiem, tak jak robią to in this example, ale zastanawiam się, dlaczego AV * nie działa! Na przykład, będę chciał użyć podprogramu do konwersji tablic perlowych przekazywanych do C++ na wektory, np. void perl2vector(AV* ar, std::vector<T> &v) {...}, zamiast wstawiania kodu do wykonania takiej konwersji do każdej napisanej przeze mnie funkcji w C++, która pobiera argument tablicowy. Jak mogę użyć tej przykładowej składni do przekazania tablicy perl do takiego konwertera?


To wydaje się być błąd, ale w międzyczasie uesp znalazł obejście:

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

arr jest równoważna arrayIn pożądanym w kodzie przykładzie powyżej.

+2

Działa dobrze dla mnie: Perl 5.14.0 i686-linux-thread-multi, Inline 0.5, Inline :: CPP 0.38. Wygląda na naprawiony błąd, jak powiedział Uesp, chociaż wydaje się, że wszystko, co musisz zrobić, to zaktualizować Inline :: CPP (nie Perl) do wersji 0.29 lub wyższej. – ikegami

+0

hrmm, używam perl v5.12.3 z Inline :: CPP v0.38. Spróbuję zaktualizować perl i zobaczę, czy to pomaga. – flies

+0

Mam inne pudełko z perl v5.12.4 i mam ten sam błąd. Rozmawiam z sysadminem ... – flies

Odpowiedz

4

Wygląda na to, że jest identyczny z this Perl bug, który istnieje w wersji 5.10.0 i powinien zostać naprawiony w wersji 5.10.29. Jeśli używasz wersji 5.10.0-28, spróbuj zaktualizować. Jeśli nie korzystasz z tych wersji i nadal otrzymujesz błąd, możesz spróbować zrobić to, co jest wymienione w this forum post, zmieniając AV na SV.

+0

Aktualnie używam perl v5.12.3 – flies

+0

Spróbuj wykonać test używając 'SV' i sprawdź, czy to działa. Jeśli nie, lub inne trywialne testy funkcji C++ powoduje podobny błąd, to jest inny problem. – uesp

+0

'int f (SV * arrayIn) {return 1; } 'działa, ale nie jestem pewien, w jaki sposób mogę użyć SV, aby uzyskać dostęp do tablicy (użyłem wcześniej Inline :: C, ale nigdy nie xs, więc moje doświadczenie jest ograniczone). Czytam perlguts ... – flies

Powiązane problemy