2011-11-03 11 views
7

मैं एक ऐसे अनुप्रयोग में उपयोग के लिए एक संचार मिडलवेयर तैयार कर रहा हूं जिसमें एडा में एक मॉड्यूल और सी ++ में कई मॉड्यूल हैं जो गुजरने वाले पैरामीटर (स्केलर मान) और संरचनाओं को संचारित करते हैं। एप्लिकेशन एमएस विंडोज एक्सपी और विंडोज 7 में चलता है, सी ++ भाग एमएसवीसी ++ 2008 में विकसित किया जा रहा है, एडीए भाग जीपीएस/जीएनएटी का उपयोग करके विकसित किया जा रहा है। एडीए संस्करण 1 99 5 है, लेकिन हम नए एडीए स्पेक का उपयोग करने की संभावना के साथ एक कंपाइलर माइग्रेशन (जीपीएस/जीएनएटी का नया संस्करण) के बीच में हैं।क्या एडा संस्करण रिकॉर्ड सी ++ यूनियन के लिए बाइनरी संगत हो सकता है?

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

सवाल यह है कि सी ++ यूनियन बाइनरी एडा संस्करण रिकॉर्ड के अनुकूल हैं? दूसरे शब्दों में, अगर मैं एडीए कोड को सी ++ यूनियन पास करता हूं तो क्या यह इसे एक संस्करण रिकॉर्ड के रूप में पढ़ने में सक्षम होगा? (और इसके विपरीत)

मुझे लगता है कि यह संभव हो सकता है के लिए कुछ समायोजन आवश्यक हो जाएगा ...

+1

आपको शायद प्लेटफ़ॉर्म, कंपाइलर इत्यादि निर्दिष्ट करने की आवश्यकता होगी –

+0

धन्यवाद, अभी और जोड़ा गया हमारे पर्यावरण के बारे में जानकारी। – Guarita

उत्तर

2
(उदा .: सी ++ यूनियनों एक सदस्य है जो अपनी सामग्री का वर्णन एडीए संस्करण रिकॉर्ड है जबकि शामिल नहीं है)

नहीं। जैसा कि आप स्वयं को बताते हैं, एडा संस्करण रिकॉर्ड में एक टैग फ़ील्ड होता है। सी संघ में ऐसा नहीं है। (कम से कम एमएसवीसी ++ और जीसीसी में नहीं - यह आईएसओ सी द्वारा अनुमत है)

+0

अहम, हाँ, लेकिन मेरा सवाल यह है कि सी यूनियनों को एडा के वेरिएंट के साथ संगत होना संभव है, कुछ अतिरिक्त काम प्लग-एन-प्ले नहीं। मुझे उम्मीद है कि सी भाग को एडीए कोड में द्विआधारी-बात करने के लिए अनुकूलित करने में कुछ परेशानी होगी। – Guarita

7

संभवतः।

एडा 2005 Unchecked_Union प्रगामा प्रदान करता है जो किसी प्रोग्राम को दिए गए भेदभाव वाले प्रकार और कुछ सी संघ के बीच एक इंटरफेस पत्राचार "[निर्दिष्ट] करने की अनुमति देता है। प्रज्ञा निर्दिष्ट करती है कि संबंधित प्रकार को एक प्रतिनिधित्व दिया जाएगा जो इसके लिए कोई जगह नहीं छोड़ता विभेदक (रों)। "

आरएम सेक्शन के पढ़ने से, एक एक प्रकार का एडीए प्रकार घोषित करता है जिसमें एक भिन्न रिकॉर्ड को परिभाषित करने के लिए आवश्यक भेदभावकर्ता हैं, लेकिन भेदभावकर्ताओं के लिए कोई संग्रहण स्थान आवंटित नहीं किया जाता है। मैं इसे एडा पक्ष पर लेता हूं कि भेदभावकर्ता को बाद में संदर्भित नहीं किया जा सकता है। (अन्य प्रतिबंध भी हैं, जैसे कि सभी फ़ील्ड सी-संगत होना चाहिए, अधिक जानकारी के लिए RM B.3.3 देखें।)

मैंने कभी इस प्रज्ञा का उपयोग नहीं किया है, और मैं मदद नहीं कर सकता लेकिन सोचता हूं कि इसे कुछ की आवश्यकता होगी इसे अपने सिस्टम के साथ काम करने के लिए प्रयोग (उम्मीद है)। सौभाग्य!

+2

कुछ प्रयोग यह पता लगाना होगा कि क्या आपको एमएसवीसी ++ की अपेक्षाओं को रिकॉर्ड करने के लिए जीएनएटी को बताना होगा, और यदि ऐसा है तो। जीएनएटी निश्चित रूप से जीसीसी के सम्मेलनों को समझता है; जब तक आप स्वयं को यूनियनों और सीधा प्रकारों तक सीमित करते हैं, यह बहुत बुरा नहीं होना चाहिए। –

+1

विंडोज़ पर जीसीसी प्लेटफार्म सी एबीआई के अनुरूप है, इसलिए विंडोज़ पर जीएनएटी एमबीवीसी ++ के साथ एबीआई संगत होना चाहिए। – MSalters

3

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

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

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

+0

"जैसा कि एमएसल्टर्स ने उल्लेख किया है, यह तब तक काम नहीं करेगा जब तक कि किसी कारण से सी संघ में भिन्नता वाले क्षेत्र को शामिल न किया जाए।" हो सकता है कि मैं इसे एक संरचना के साथ कर सकता हूं जैसे: स्ट्रक्चर फू { some_tag_type टैग; यूनियन { ... } my_union; } ?? – Guarita

+0

@guarita एक उपयोगी लिंक के लिए मेरा जवाब देखें - मुझे लगता है कि आप इस विचार के साथ सही रास्ते पर हैं। – NWS

+0

हां। जैसा कि @ एनडब्लूएस ने कहा, आप सही रास्ते पर हैं। –

5

हां।

एडा सी/सी ++ यूनियनों के साथ संगत है। इसे कैसे करें (पीडीएफ) के लिए here देखें विशेष रूप से पृष्ठ 5 दिखाता है कि यूनियनों & टैग के साथ इसे कैसे किया जाए। यह भेदभाव रिकॉर्ड का उपयोग करने के लिए समान होना चाहिए। (चेतावनी: शायद यह आपके द्वारा उपयोग किए जा रहे कंपाइलर नहीं है, लेकिन अगर आपका कोई भी व्यवहार नहीं करता है तो मुझे आश्चर्य होगा!)

+1

मुझे लगता है कि आप उम्मीद के बारे में थोड़ा आशावादी हैं कि कोई भी एडीए/सी/सी ++ कंपाइलर्स को इस बात को संभालने के लिए अलग-अलग चिंता करने की उम्मीद कर सकता है, लेकिन यह समस्या के लिए एक उपयोगी मार्गदर्शिका है। –

+0

@Marc मेरा आशावाद इस तथ्य पर आधारित है कि एडा संकलक को सत्यापित किया जाना चाहिए, इसलिए वे वही काम करने में सक्षम होना चाहिए (भले ही समान रूप से अच्छी तरह से नहीं!) – NWS

+0

यह एडी पक्ष नहीं है जिसके बारे में मैं चिंतित हूं, यह क्षेत्र है विभिन्न कंपाइलरों के बीच लेआउट और लिंकिंग मिनुटिया जो मुझे संदेहजनक बनाता है (आशावाद :-)। मैं बाइंडिंग के लिए अजनबी नहीं हूं, जीएनएटी और जीसीसी के बीच डेटा संरचनाओं को साझा करने के लिए भी देखभाल की आवश्यकता है। –

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