2014-04-11 7 views
7

के साथ एक perl routine पर कॉल करें मुझे अपने सी प्रोग्राम में एक perl routine कॉल करने की आवश्यकता है। पर्ल रूटीन निम्नलिखित तर्क लेता है: $a, $b, $c, जहां $a और $b पूर्णांक हैं, $c एक स्ट्रिंग है (बाइनरी वर्ण हो सकते हैं)। perlcall के अनुसार, यहां कॉल करने के साधन हैं।पैरामीटर

I32 call_sv(SV* sv, I32 flags); 
I32 call_pv(char *subname, I32 flags); 
I32 call_method(char *methname, I32 flags); 
I32 call_argv(char *subname, I32 flags, char **argv); 

लगता है कि मैं केवल call_argv (...) का उपयोग कर सकते है, लेकिन वहाँ दो सवाल

हैं
  • कैसे मैं पर्ल दिनचर्या
  • को एक पूर्णांक पारित कि कैसे मैं एक से पारित है (बाइनरी) स्ट्रिंग करने के लिए स्ट्रिंग?

विश वहाँ Passing Parameters section of perlcall देखें तरह

I32 call_argv(char *subname, I32 flags, int numOfArgs, SV* a, SV* b, SV *c ...); 
+0

perlcall में एक कारण के लिए "पासिंग पैरामीटर्स" लेबल वाला एक अनुभाग है। आप इसे पर्ल स्टैक पर डालकर करते हैं। सुझाव के लिए – hobbs

उत्तर

8

एक समारोह है। पर्ल स्टैक पर तर्क धकेल दिए जाते हैं। call_argv तारों के अलावा कुछ भी पारित करने के लिए उपयोगी नहीं है। बुला सम्मेलन की तरह

PUSHMARK(SP); 
mPUSHi(some_integer); 
mPUSHp(binary_data, len); 
XPUSHs(some_SV_I_had_laying_around); 
PUTBACK; 
call_pv("sub_name", G_DISCARD); 

कुछ ऐसा दिखाई देगा या आप call_svcall_method उपयोग करें यदि आप एक SV* में SUBNAME हो सकता है, या किसी वस्तु पर नाम से एक विधि कॉल करने के।

यदि उप मूल्य या मान देता है तो आप इसे G_SCALAR या G_ARRAY के साथ कॉल कर सकते हैं और वापसी मूल्यों तक पहुंचने के लिए POP मैक्रोज़ का उपयोग कर सकते हैं; यह निम्नलिखित दो खंडों में विस्तृत है। SPAGAIN को मत भूलना।

+0

धन्यवाद! "पासिंग पैरामीटर्स" अनुभाग में उदाहरण बिल्कुल वही है जो मैं ढूंढ रहा था। पूछने से पहले पूरे मैनुअल को पढ़ना चाहिए था :-( – packetie

+0

उस कोड का मामूली नीरस 'mPUSH * 'परिवार का उपयोग करना है, क्योंकि वे एसवी को धक्का देते हैं। इसके अलावा कुछ विशिष्ट हैं, जैसे कि IV के लिए' mpushii ' और पीवी के लिए 'mPUSHP'। – LeoNerd

+0

@LeoNerd आगे बढ़ें और संपादित करें यदि आप चाहें :) – hobbs