2010-02-26 19 views
5

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

त्रुटि ... (एडीए 95 GNAT 2009)

file.adb:XX no selector "Data" for private type "The_Transfer_Type" defined at file.ads:YY 

घोषणा ...

generic 
    type The_Transfer_Type is private; 
    SIZE : Integer; 
package CC_Test_Channel is 
    function Checksum(Msg : The_Transfer_Type) return Integer; 
end package 

और शरीर ...

function Checksum(Msg : The_Transfer_Type) return Integer is 
    Sum : Integer := 0; 
begin 
    -- calculate the checksum 
    for i in 1 .. SIZE loop 
    Sum := Sum + Integer(Msg.Data(i)); 
    end loop; 
    return Sum; 
end Checksum; 

उत्तर

5

जब आप निर्दिष्ट कि एक सामान्य पैरामीटर एक निजी प्रकार है, ठीक है, एडा मानता है कि आप इसका मतलब है :-)

आईई। आपके पास इसके घटकों तक पहुंच नहीं है। एडा "duck typed" नहीं है, इसलिए यह अप्रासंगिक है कि आप जानते हैं कि एक तत्काल प्रकार वास्तव में एक विशेष क्षेत्र हो सकता है। (आप अपने चेकसम फ़ंक्शन को काम करने की अपेक्षा कैसे करेंगे यदि कहें, इंट्रगर के साथ The_Transfer_Type पैरामीटर को तत्कालित किया गया था?)

इसका समाधान करने का एक तरीका सामान्य के लिए पैरामीटर के रूप में एक एक्सेसर फ़ंक्शन भी प्रदान करना है जो आवश्यक डेटा पुनर्प्राप्त करेगा इस मामले में, चेकसम की गणना करें। उदा .:

generic 
    type The_Transfer_Type is private; 
    with function Get_Checksummable_Data_Item 
      (Msg : The_Transfer_Type; 
      I : Integer) return Integer; 
    SIZE : Integer; 

package CC_Test_Channel is 
    function Checksum(Msg : The_Transfer_Type) return Integer; 
end CC_Test_Channel; 

शरीर तो है:

function Checksum(Msg : The_Transfer_Type) return Integer is 
    Sum : Integer := 0; 
begin 
    -- calculate the checksum 
    for i in 1 .. SIZE loop 
     Sum := Sum + Get_Checksummable_Data(Msg, I); 
    end loop; 
    return Sum; 
end Checksum; 

समारोह आप Get_Checksummable_Data के लिए आपूर्ति तो The_Transfer_Type लिए विशिष्ट है और बस The_Transfer_Type के घटक क्षेत्रों से चयनित मान देता है।

इसे स्थापित करने के कई अन्य तरीके भी हैं, जैसे एक सामान्य औपचारिक पैरामीटर के रूप में एक अनियंत्रित सरणी प्रकार प्रदान करना और इसे पुनर्प्राप्त करने के लिए एक औपचारिक कार्य - यह आपको स्पष्ट SIZE औपचारिकता से छुटकारा पाने की अनुमति देता है पैरामीटर। या आप प्रकार पर कार्य है कि आप के साथ CC_Test_Channel instantiating रहे हैं में से एक के रूप में एक Checksum() फ़ंक्शन लिख सकता है, और उसके बाद है:

with function Calculate_Checksum(Msg : The_Transfer_Type) return Integer; 
सामान्य औपचारिक में से एक के रूप में

चरण वापस, और संभावनाओं के बारे में सोचना ...

+0

जब तक वह वापस कदम उठा रहा है, तब तक वह डेटा ऑपरेशन का उपयोग करने के लिए धारा संचालन का उपयोग करने पर विचार करने योग्य हो सकता है ... –

+0

यह वह समाधान था जिसके साथ मैं गया था। स्ट्रीम ऑपरेशंस क्या हैं? –

+0

उत्तर बहुत लंबा हो गया, और मैंने तय किया कि इसे स्वरूपण की आवश्यकता है, इसलिए मैंने इसे नीचे दूसरे जवाब में स्थानांतरित कर दिया। –

3
generic 
    type The_Transfer_Type is private; 
    ... 

उपरोक्त कोड का मतलब है कि ग्राहक (के रूप में यह "सीमित" नहीं है जब तक) किसी भी प्रकार वे The_Transfer_Type के लिए सपना आपूर्ति कर सकते हैं । इसका यह भी अर्थ है कि आपका जेनेरिक इस प्रकार के बारे में बिल्कुल कुछ नहीं जानता है, सिवाय इसके कि असाइनमेंट उपलब्ध है।

एडा जेनेरिक के साथ एक सामान्य पैरामीटर के लिए कितने प्रकार की वस्तुओं की आपूर्ति की जा सकती है, और उन वस्तुओं पर जेनेरिक के लिए कौन से ऑपरेशन उपलब्ध हैं, के बीच एक व्यस्त संबंध है। उदाहरण के लिए, सबसे खुला प्रकार is limited private होगा। आप उनमें से किसी एक के लिए किसी भी तरह की चीज़ों की आपूर्ति कर सकते हैं। हालांकि, जेनेरिक इसके साथ लगभग कुछ भी नहीं कर सकता है। यहां तक ​​कि असाइनमेंट भी उपलब्ध नहीं होगा।

"सीमित" को दूर करें और आप इसके साथ असाइनमेंट कर सकते हैं, लेकिन केवल उन्हीं प्रकारों को असाइन किया जा सकता है।दूसरी चरम पर, आप इसे परिभाषित कर सकते हैं: type The_Transfer_Type is (<>) और फिर आप किसी भी पूर्णांक या गणना प्रकार की आपूर्ति कर सकते हैं, और 'first जैसी चीजें हासिल करेंगे। अभी भी आगे जा रहे हैं, आप type The_Transfer_Type is range <> कर सकते हैं, और आप पूर्णांक गणित परिचालन करने की क्षमता प्राप्त करेंगे, लेकिन केवल पूर्णांक संख्यात्मक प्रकारों की आपूर्ति करने में सक्षम होंगे।

4

(एक टिप्पणी से चले गए इस रूप में लंबे समय मिल गया)

एडीए (95 और बाद में) धाराओं का समर्थन करता है। सी ++ धाराओं के विपरीत, जो स्ट्रिंग रूपांतरण के लिए बहुत अधिक हैं, एडा स्ट्रीम डेटा (आमतौर पर I/O) पर संचालन करने के लिए एक सामान्य तंत्र के रूप में हैं।

प्रत्येक एडा ऑब्जेक्ट में 'Write और 'Read विशेषताएँ हैं। कुछ भाषा आपूर्ति धाराएं हैं (फ़ाइल I/O के लिए), लेकिन आपके पास Ada.Streams.Root_Stream_Type से प्राप्त करके स्वयं को बनाने की क्षमता भी है। यदि आप इस तरह से अपनी खुद की स्ट्रीम लिखते हैं, तो कुछ निम्न-स्तरीय दिनचर्याएं हैं जो आपको डेटा तक सीधे पहुंच प्रदान करती हैं।

यह आपको अपनी स्वयं की स्ट्रीम लिखने के लिए ('पढ़ें के माध्यम से) चर में लोड करने से पहले मैं/हे, डेटा संपीड़न, की तरह या अपने मामले शायद बस से डेटा checksumming में कार्रवाई करने की अनुमति देता है। मैंने अपने रीयल-टाइम सॉफ़्टवेयर के लिए रिकॉर्ड/प्लेबैक कार्यक्षमता को लागू करने के लिए अतीत में इसे स्वयं किया है। मैंने इसे एक बार संपीड़न के लिए भी देखा (हमने संपीड़न की आवश्यकता नहीं समाप्त की)।

+0

एचएम, मैं स्ट्रीम/संपीड़न के संबंध में संभावित * एक * बहुत * देखता हूं। क्या आपके पास पोस्ट करने का एक उदाहरण है? यदि ऐसा है तो मुझे इसे देखने में सबसे ज्यादा दिलचस्पी होगी। – Shark8

+0

@ शार्क 8 - दुख की बात है, नहीं। मैंने एक बार सिम्युलेटर रिकॉर्ड/प्लेबैक सिस्टम के लिए डेटा स्नैपशॉटिंग और बहाली को लागू करने के लिए व्यक्तिगत रूप से कस्टम स्ट्रीम का उपयोग किया है, लेकिन यह प्रोपेरेटरी कोड है। मैंने एक बार लार्क्स पर एडा के लिए एक फ्री सॉफ्टवेयर संपीड़न लाइब्रेरी को लागू करने के लिए धाराओं का उपयोग करने में देखा, लेकिन इसके साथ बहुत दूर नहीं आया। हालांकि पहले से उपरोक्त प्रोफेसर को पूरा करने के बाद, मुझे विश्वास है कि यह काफी व्यवहार्य है। –

+0

मुझे बूच आई विश्वास द्वारा कहीं भी एक एडा [83] पुस्तक मिली, जिसमें "पाइप" आईआईआरसी के लिए कुछ रोचक संरचनाएं थीं ... मुझे आश्चर्य है कि मैंने इसे कहां रखा था। – Shark8

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