2012-06-21 18 views
5

डीएलएल सीमाओं पर एसटीएल कंटेनर का खुलासा करना एक अच्छा विचार नहीं है, और आम तौर पर संभव नहीं है (this answer for why, और this one को एक डीएल पर एक std :: सूची को उजागर करने के बारे में देखें सीमा)। मुझे अलग-अलग (वीसी 08/वीसी 10 +) कंपाइलर्स के साथ संकलित डीएलएल और एक्सई के बीच डेटा पास करने में सक्षम होना चाहिए; this Q केवल वही सब कुछ है जो एक जैसा है।एक डीएलएल सीमा पर std :: vector का खुलासा - संकलक स्वतंत्रता के लिए सर्वोत्तम अभ्यास

उन्हें बेनकाब करने का सबसे अच्छा तरीका क्या है? वेक्टर सूचियों से थोड़ा अलग हैं जिसमें स्मृति को संगत होने की गारंटी दी जाती है, इसलिए यदि मुझे केवल युगल के कॉन्स वेक्टर की आवश्यकता है, तो क्या मैं केवल डीएल में फ़ंक्शन में ब्लॉक के लिए प्रारंभ और अंत पॉइंटर्स की आपूर्ति कर सकता हूं? डीएल को वैक्टरों की एक सरणी की तरह कुछ संरचना वापस करने की भी आवश्यकता है।

template <typename T> 
struct vecWrapper<T> { 
    T* begin; 
    T* end; 
} 

// in the dll 
int func(vecWrapper<double> numbers); 

कि समझदार होगा:

मैं एक struct शुरू और समाप्त संकेत युक्त के बारे में सोचा? संभवत: फ़ंक्शन से जो कुछ भी लौटाया जाता है उसे एक विनाशक (डीएलएल पक्ष पर) की आवश्यकता होती है जो चीजों को नष्ट कर देती है।

+2

संबंधित, कृपया पढ़ें: http://stackoverflow.com/questions/5661738/common-practice-in-dealing-with-warning-c4251-class-needs-to-have-dll-inter/5664491#5664491 –

+0

चीयर्स @ जॉन डीबलिंग, यह एक अच्छा स्पष्टीकरण है कि एसटीएल कंटेनर का पर्दाफाश क्यों न करें। इसलिए डेटा का खुलासा करने का सवाल खुद ही है। मैं उम्मीद कर रहा हूं कि आगे की आवश्यकता के बिना संगत आवश्यकता संभव हो जाती है। –

+0

क्यों न केवल एक पुरानी पुरानी सरणी पास करें? – Rook

उत्तर

3

आपने इसे काफी पसंद किया है। मानक को वेक्टर तत्वों को स्मृति में संयोजित करने की आवश्यकता होती है, और वेक्टर तत्वों को तब तक आवंटित नहीं किया जाएगा जब तक आप वेक्टर के आवंटक के साथ गेम नहीं खेल रहे हैं, इसलिए वेक्टर के डेटा को प्रारंभ और अंत सूचक के रूप में प्रस्तुत करना हमेशा संभव होता है (या एक प्रारंभ सूचक और आकार, अगर यह आपकी बात है)। आपको क्या करना चाहिए ठीक है।

हालांकि, मुझे यकीन नहीं है कि इसका कितना उपयोग है। std::vector स्वचालित स्मृति प्रबंधन को छोड़कर वास्तव में आपको कुछ भी प्रदान नहीं करता है, और आप इसे नहीं चाहते हैं; अन्यथा डीएलएल में आपके द्वारा बनाए गए किसी भी वैक्टर, जब नष्ट हो जाएंगे, तो युगल की अपनी मूल सरणी को हटा दें। आप सरणी की प्रतिलिपि बनाकर उस पर जा सकते हैं, लेकिन आपने कहा है कि आप इसे भी नहीं करना चाहते हैं। एसटीएल एल्गोरिदम पॉइंटर्स पर ठीक काम करते हैं, इसलिए शायद डीएलएल में कनवर्ट करने की कोई आवश्यकता नहीं है।

+0

यह मुझे कॉलिंग कोड के भीतर स्वचालित मेमोरी प्रबंधन देता है और कॉल कोड में स्थानीय रूप से घोषित वैक्टर, मुझे लगता है कि रिटर्न वेक्टर समेत, मुझे लगता है। इसलिए जब वे ढेर से बाहर निकलते हैं तो डीएल में पारित वेक्टर स्वचालित रूप से नष्ट हो जाएंगे, जैसे लौटे वेक्टर को जब इसके विनाशक को कहा जाता है (वापस डीएल के अंदर)। –