में struct एक libx.so
जो 2 काम करता है, और एक struct
निर्यात नहीं है,सी अजगर
typedef struct Tag {
int num;
char *name;
}Tag;
Tag *create(int n, char *n)
{
Tag *t = malloc(sizeof(Tag));
t->num = n;
t->name = n;
return t;
}
void use(Tag *t)
{
printf("%d, %s\n", t->num, t->name);
}
मैं अजगर में create
फोन और फिर सहेजना चाहते Tag *res
create
द्वारा दिया, बाद में मैं use
और पास कॉल करेंगे (बस प्रदर्शित करने के लिए) Tag *res
use
से पहले बचाया, यहाँ यह है:
>>>libx = ctypes.CDLL("./libx.so")
>>>res = libx.create(c_int(1), c_char_p("a"))
>>>libx.use(res)
ऊपर कोड गलत हो सकता है, बस प्रदर्शित करने के लिए जो मैं चाहता करने के लिए।
और मेरी समस्या यह है कि, मैं create
द्वारा परिणाम को कैसे सहेज सकता हूं? चूंकि यह उपयोगकर्ता द्वारा परिभाषित struct
पर एक सूचक देता है, और मैं पाइथन में struct Tag
के समकक्ष का निर्माण नहीं करना चाहता, c_void_p
चाल करेगा?
सूचक (
c_char_p("a")
)create
को कॉल की अवधि के लिए ही मान्य है:अद्यतन
से @ डेविड का जवाब, मैं अभी भी काफी एक बात समझ में नहीं आता। जैसे ही रिटर्न बनाएं, वह सूचक लंबा मान्य नहीं है।
और मैं create
में t->name
को c_char_p("a")
असाइन करते हैं, जब create
खत्म करने के लिए कॉल, t->name
एक dangling सूचक है? चूंकि उद्धृत शब्दों के अनुसार, यह सूचक अब create
के बाद मान्य नहीं है। क्यों c_char_p("a")
अब मान्य नहीं है?
मैं सिर्फ मेरी पैंट –
ठीक है, सर में बदबूदार चला गया, वहाँ 3 बातें मुझे समझ नहीं आता है। 1, 'उस ctypes स्मृति के सूचक केवल कॉल की अवधि के लिए वैध है।' वह क्यों है? मुझे लगता है यह क्योंकि 'create',' c_char_p ("एक") 'के रेफरी गिनती करने के लिए कॉल के बाद शून्य करने के लिए चला जाता है, सही है, तो' "एक" 'कचरा-एकत्र किया जाता है? 2, अपने कोड में, 'res' एक' c_void_p' वस्तु है, लेकिन, मैं तो बस किसी भी डाली बिना res' पारित कर सकते हैं '' सीधे libx.use' को 'libx.use' एक' टैग * 'आर्ग लेता है? 3, मुझे स्पष्ट रूप से 'नष्ट (res) 'क्यों करना चाहिए? – Alcott
मैं सिर्फ एक परीक्षण चलाता हूं, ऐसा लगता है कि मेरा कोड सही ढंग से काम कर सकता है, महोदय। – Alcott