6

これがバグなのか、何なのかわかりません。

次のコードは動作しますが、動作しInline::Cません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);
}

上記は正常に実行されますが、に置き換えるCCPP、エラーが発生しますCan't locate auto/main/findAvLen.al in @INC...

他のインラインC++コードを動作させることができます。たとえば、この例のように、変数のリストを省略記号を使用してインラインコードに渡すことは可能ですが、なぜAV*が機能しないのでしょうか。たとえば、サブルーチンを使用して、C ++に渡されたperl配列をベクトルに変換したいと思います。たとえばvoid perl2vector(AV* ar, std::vector<T> &v) {...}、配列引数を取るすべてのC ++関数にそのような変換を実行するコードを挿入するのではなく、その例の構文を使用して、perl配列をそのようなコンバーターに渡すにはどうすればよいですか?


これはバグのようですが、それまでの間、uespは回避策を見つけました。

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

arrarrayInこれで、上記のサンプルコードで必要なものと同等になります。

4

1 に答える 1

4

これは、5.10.0に存在し、リリース5.10.29で修正されているはずのこのPerlバグと同じように見えます。5.10.0-28を実行している場合は、更新してみてください。これらのバージョンを実行していないのにエラーが発生する場合は、をに変更して、このフォーラム投稿に記載されていることを試してみてくださいAVSV

于 2012-04-04T18:00:32.883 に答える