2017-05-30 22 views
8

की विशेषता के रूप में structs के ऐरे, मैं एक सी संरचना को समाहित करने की कोशिश कर रहा हूं, जिसमें से एक सदस्य structs के पॉइंटर्स की एक सरणी है, और मुझे यह पता लगाने में समस्याएं आ रही हैं कि इसे कैसे किया जाए।पर्ल 6 नेटिवॉल संरचना

मान लीजिए कि सी कोड इस तरह दिखता है:

struct foo 
{ 
    unsigned char a; 
}; 

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

कोड इस प्रकार का काम करता है:

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

मैं इसके लिए एक नमूना कोड लिखता हूं। सी पक्ष:

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 सी की ओर से एक ढेर चर प्राप्त करने का समर्थन नहीं करता है, तो आप malloc ढेर पर एक struct bar आवंटित उपयोग करना चाहिए।

फिर जीसीसी के साथ कोड संकलित करें, जैसे कि gcc -shared -fPIC -o libshasa.so xxx.c

और यह 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; 

यह आउटपुट:

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

क्या मैं इस 'वर्ग बार की तरह कुछ था पाने के लिए कोशिश कर रहा था रेपर ('CStruct') है {foo है @ .a} ', जो सही वाक्यविन्यास नहीं है, क्योंकि 'foo' नेटकॉल का उपयोग कर एक स्वीकृत विशेषता प्रकार नहीं है। –

+0

@FernandoSantagata बेशक यह समर्थन नहीं करता है कि, राकुडो के सरणी में सी सरणी (ढेर पर आवंटित) के साथ अलग-अलग मेमोरी लेआउट है। मुझे मेटा-ऑब्जेक्ट प्रोटोकॉल के साथ मेटा-ऑब्जेक्ट प्रोटोकॉल के साथ स्वत: जोड़ विशेषता, एक सरणी अनुकरण करने का एक तरीका मिलना चाहिए, लेकिन कोई भूमिका बनाने या मैन्युअल रूप से मैनिपुलेशन करने के बारे में कोई दस्तावेज नहीं है, या एक विशेषता जोड़ें (एचएएस द्वारा घोषित) मेटा-ऑब्जेक्ट प्रोटोकॉल तरीके में। शायद आप राकुडो कोर डेवलपर को एक प्रश्न ईमेल भेज सकते हैं। – araraloren

संबंधित मुद्दे