I can't tell if this is a bug or what.
The following code works with Inline::C
but not 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);
}
The above runs fine, but replace C
with CPP
, and I get the error Can't locate auto/main/findAvLen.al in @INC...
I can get other inline c++ code to work. It is possible, for instance, to pass a list of variables to inline code with an ellipsis as they do in this example, but I wonder why AV* isn't working! For instance, I will want to use a subroutine to converts perl arrays passed to C++ into vectors, e.g. void perl2vector(AV* ar, std::vector<T> &v) {...}
, rather than inserting code to perform such conversion into every C++ function I write that takes an array argument. How could I use that example's syntax to pass the perl array to such a converter?
This does seem to be a bug, but in the meantime, uesp has found a workaround:
int findAvLen(SV* arrRef) {
AV * arr = MUTABLE_AV(SvRV(arrRef));
return av_len(arr);
}
arr
is now equivalent to the arrayIn
desired in the example code above.
This appears to be be identical to this Perl bug which exists in 5.10.0 and should have been fixed in release 5.10.29. If you are running 5.10.0-28 try updating. If you aren't running these versions and still getting the error you can try doing what is mentioned in this forum post by changing the AV
to SV
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With