2017-05-30 17 views
8

構造体へのポインタ配列であるC構造体をカプセル化しようとしていますが、これを行う方法がわかりません。この種のコードは動作しますPerl 6 NativeCall構造体の属性としての構造体の配列

struct foo 
{ 
    unsigned char a; 
}; 

struct bar 
{ 
    struct foo *f[5]; 
}; 

はのは、Cのコードは次のようになりましょう

use NativeCall; 

class foo is repr('CStruct') { 
    has uint8 $.a; 
} 

class bar is repr('CStruct') { 
    has foo $.f1; 
    has foo $.f2; 
    has foo $.f3; 
    has foo $.f4; 
    has foo $.f5; 
} 

が、それはひどいです。

CArrayは、ポインタの配列ではなく、配列へのポインタなので、ここでは使用しません。 has A @.aのようなものは使用できません。repr('CStruct')はその種の属性を処理しないためです。

ヒント?

答えて

1

私はこれのためのサンプルコードを書いています。 C側:

struct bar* create_bar_ptr(unsigned char a) 
{ 
    printf("GET A CHAR => %#0x = %c\n", a, a); 

    struct bar* bar = (struct bar*)malloc(sizeof(struct bar)); 

    for (size_t i = 0;i < 5;i ++) { 
     struct foo* tf = (struct foo*)malloc(sizeof(struct foo)); 

     tf->a = a + i; 
     bar->f[i] = tf; 
    } 

    printf("CREATE BAR PTR OK\n"); 

    return bar; 
} 

RakudoはC側からスタック変数を取得してサポートしていないので、あなたは、malloc関数は、ヒープ上struct barを割り当てる使用する必要があります。

次に、gcc -shared -fPIC -o libshasa.so xxx.cなどのgccを使用してコードをコンパイルします。

そして、これはPerl6の側である:

use NativeCall; 

class foo is repr('CStruct') { 
    has uint8 $.a; 
} 

class bar is repr('CStruct') { 
    # Here you should use !!HAS!!, not has 
    HAS Pointer[foo] $.f1; 
    HAS Pointer[foo] $.f2; 
    HAS Pointer[foo] $.f3; 
    HAS Pointer[foo] $.f4; 
    HAS Pointer[foo] $.f5; 
} 


sub create_bar_ptr(uint8) returns Pointer[bar] is native('./libshasa.so') { * } 

my Pointer[bar] $p = create_bar_ptr(uint8.new(97)); 

say $p.deref."f{$_}"().deref.a for 1 .. 5; 

この出力:私は、この `クラスのバーのようなものだった取得しようとしていたことのreprが( 'cstructは')である

GET A CHAR => 0x61 = a 
CREATE BAR PTR OK 
97 
98 
99 
100 
101 
+0

{fooのを持っています@ 'foo'はNativeCallを使った受け入れられた属性型ではないため、正しい構文ではありません。 –

+0

@FernandoSantagataもちろん、それはサポートしていません、Rakudoの配列はC配列(スタックに割り当てられた)とは異なるメモリレイアウトを持っています。私は、メタオブジェクトプロトコルを使用してメタオブジェクトプロトコル(メタオブジェクトプロトコルを使用した属性の自動化、配列のエミュレーションの自動化)を行う方法を見つけたいが、作成または手動操作に関する文書はなく、属性(HASによって宣言されている)メタオブジェクトプロトコルの方法で。多分Rakudoコア開発者に質問メールを送ることができます。 – araraloren