2012-09-20 10 views
6

पास करें मुझे एक एडीए प्रोग्राम से डेटा के 2 टुकड़े प्रोसेसिंग के लिए कुछ सी ++ कोड में पास करने की आवश्यकता है।एडी से सी ++: एक हस्ताक्षरित 64-बिट मान

  • डेटा - डबल।
  • समय - हस्ताक्षर 64 बिट्स।

मैं एडीए में एक प्रक्रिया है कि मेरी सी ++ एक Long_Float (सी में डबल ++) और पूर्णांक का उपयोग कर विधि के साथ काम किया बनाने के लिए कर रहा था (सी में पूर्णांक ++ नहीं 64-बिट जाहिर है, हालांकि)। मैं निम्नलिखित कोड (कोड मुझ पर नहीं तो वाक्य रचना थोड़ा दूर हो सकता है) का इस्तेमाल किया:

procedure send_data (this : in hidden_ptr; data : in Long_Float; time : in Integer); 
pragma import (CPP, send_data, "MyClass::sendData"); 
अब

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

type U64 is mod 2 ** 64; 

जब मेरे send_data विधि के साथ उस प्रकार का उपयोग कर मैं कह वहाँ एक करने के लिए उस प्रकार मैप करने के लिए कोई संभव तरीके हैं कोई त्रुटि मिलती है सी ++ प्रकार (उन पंक्तियों के साथ कुछ, फिर मेरे पास कोड या सटीक त्रुटि वाक्यांश नहीं है)।

क्या एडी में उपयोगकर्ता परिभाषित प्रकार को C++ में पास करने का कोई तरीका है? शायद एडा में एक और प्रकार है जो मैं एक हस्ताक्षरित 64-बिट मान के रूप में उपयोग कर सकता हूं जो काम करेगा? क्या मेरे यू 64 प्रकार के पते को सी ++ विधि के पैरामीटर के रूप में पास करने का कोई तरीका है, अगर यह आसान है? मैं हरी पहाड़ियों adamulti संकलक v3.5 का उपयोग कर रहा हूँ (एडीए के लिए बहुत नया, यकीन नहीं है कि वह जानकारी मदद करता है या नहीं)। उदाहरणों की बहुत सराहना की जाएगी!

+6

'mod 2 ** 64' सही होना चाहिए। जब मैं जीएनएटी के साथ उस प्रकार का उपयोग करके अपना उदाहरण संकलित करता हूं, तो यह शिकायत नहीं करता है। शायद आपका एडा संकलक ऐसा नहीं सोचता कि सी ++ (या सी ++ संकलक इसे लक्षित करता है) 64-बिट हस्ताक्षरित प्रकार का समर्थन करता है; 2011 सीएसओ मानक तक मानक सी ++ को 'लंबे समय तक हस्ताक्षरित' नहीं मिला। –

+0

@ किथ थॉम्पसन - बह! कीथ के जवाबों की इन अच्छी टिप्पणियों को बनाएं, इसलिए मेरे अपवॉट्स का मतलब कुछ है, मैं उन पर सही ढंग से टिप्पणी कर सकता हूं, और अगर वे उत्तर देने का अंत हो जाते हैं तो उन्हें स्वीकार किया जा सकता है। –

+0

आप 'प्रगमा कन्वेंशन (सीपीपी, यू 64) जोड़ने का प्रयास कर सकते हैं; '। –

उत्तर

1

@ KeithThompson की टिप्पणी/उत्तर के परिशिष्ट के रूप में ...

एडीए के आधिकारिक तौर पर समर्थित सी इंटरफ़ेस प्रकार Interfaces.C में हैं, और वहाँ कोई अतिरिक्त लंबी पूर्णांक या अहस्ताक्षरित में वहाँ (2005 संस्करण में है। 2012 है संस्करण अभी तक?)।

आपने इसके आसपास काम करने के लिए सही काम किया है। यदि आपका कंपाइलर इसका समर्थन नहीं करता है, तो अधिक कठोर उपाय किए जाने होंगे।

कोशिश करने वाली पहली स्पष्ट बात संदर्भ के अनुसार 64-बिट int को पास करना है। हालांकि सी पक्ष में बदलाव की आवश्यकता होगी।

मुझे पता है सी/सी ++ टाइम स्ट्रक्चर 64-बिट मान होते हैं, जिन्हें संघीय structs के रूप में परिभाषित किया जाता है। तो आप जो कर सकते हैं वह उन सी structs में से किसी एक की नकल करने के लिए एक एडीए रिकॉर्ड को परिभाषित करता है, सुनिश्चित करें कि यह सी के तरीके से बाहर हो जाता है (उदाहरण: रिकॉर्ड प्रतिनिधित्व और आकार खंड के साथ), और उसके बाद उस वस्तु को बनाएं जो आपके आयातित दिनचर्या के लिए उपयोग करता है इसका पैरामीटर

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

अगर आप यह समझते हैं कि आपके कंपाइलर का सीपीपी कॉलिंग सम्मेलन कैसे काम करता है तो नकली करने के अन्य तरीके भी हो सकते हैं। उदाहरण के लिए, यदि यह 64-बिट इन्स को पास करने के लिए दो अनुकूल 32-बिट रजिस्टरों का उपयोग करता है, तो आप अपने एडीए 64-बिट int को दो में विभाजित कर सकते हैं और इसे एडा साइड पर दो पैरामीटर में पास कर सकते हैं। यदि यह संदर्भ द्वारा 64-बिट मानों को पास करता है, तो आप केवल एडीए पक्ष को बता सकते हैं कि आप अपने U64 पर पॉइंटर पास कर रहे हैं। दोबारा, ये समाधान पोर्टेबल नहीं होंगे, लेकिन वे आपको जायेंगे।

+1

दोनों केथ थॉम्पसन और टी.ई.डी. के सुझावों के लिए धन्यवाद। मैंने "टाइप U64_ptr का उपयोग यू 64" बनाने की कोशिश की और U64_ptr को U64 प्रकार के मान के बजाय पॉइंटर के रूप में पास कर दिया। मुझे एक ही त्रुटि मिली, U64 पर मैप करने के लिए कोई संगत सी ++ प्रकार नहीं है। मैंने एक unchecked_conversion को long_float पर भी कोशिश की, इसे C++ पक्ष पर एक डबल तक पास कर दिया और इसे लंबे समय तक एक हस्ताक्षरित करने के लिए कास्टिंग किया और कुछ फंकी मान प्राप्त किए (मुझे उम्मीद नहीं थी, आगे की जांच नहीं की गई है)। जब मैं कर सकता हूं और पोस्ट कर सकता हूं, तो मैं इसके साथ खेलना जारी रखूंगा, धन्यवाद! – Xeelot

+0

@Xeelot - "फंकी वैल्यू" आमतौर पर इंगित करता है कि एक तरफ दूसरी तरफ से अधिक संदर्भित किया गया था। –

+0

@Xeelot - "फंकी वैल्यूज" क्या आप वाकई एक बड़ी/छोटी एंडियन सीमा पार नहीं कर रहे हैं? – NWS

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