2009-06-11 12 views
12

में अस्थिर अर्थशास्त्र मुझे कुछ निम्न स्तर के कोड के साथ कोई समस्या है जो मुझे लिख रहा है, मुझे वस्तुओं को अस्थिर के रूप में उपयोग करने की आवश्यकता है, लेकिन यह आवश्यक नहीं है कि मैं प्रकारों को अस्थिर (पुन: प्रयोज्य कारणों के लिए) घोषित करना चाहता हूं। हालांकि, मैं निम्न खंड में विस्तृत रूप से संरचना के एक योग्य संस्करण में पॉइंटर को परिभाषित कर सकता हूं।सी 99

volatile struct x { 
    volatile int x; 
}; 

के बाद से अस्थिर सभी struct सदस्यों के लिए लागू होते हैं:

struct x { 
    int bar; 
}; 

struct x foobar; 
... 
volatile struct x *foo = &foobar; 

अब foo प्रभावी ढंग से प्रकार का ऑब्जेक्ट के लिए सूचक है। अब मेरा सवाल यह है कि जब किसी ऑब्जेक्ट में किसी अन्य ऑब्जेक्ट में पॉइंटर होता है, तो अस्थिरता कैसे लागू होती है?

volatile struct x { 
    struct y * volatile bar; 
}; 

या के रूप में:

struct x { 
    struct y *bar; 
}; 

एक्स के एक अस्थिर उदाहरण के लिए सूचक तो तब के रूप में इस का इलाज करेंगे

volatile struct x { 
    volatile struct y * volatile bar; 
}; 

मैं सी मानक के माध्यम से पढ़ा है, और यह इसके बारे में बहुत स्पष्ट नहीं है, और मैं आसानी से शब्द को कई तरीकों से व्याख्या कर सकता हूं।

उत्तर

4

आपके उदाहरण में आप एक अस्थिर सूचक प्राप्त करते हैं, बस इतना है कि अस्थिरता वस्तु तक विस्तारित नहीं होती है।

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

+0

http://www.netrino.com/node/80 उस विचार का समर्थन करने के लिए लगता है। मैंने कभी भी कमजोर नहीं पढ़ा है। अच्छी चीज़। – Kieveli

+1

"अस्थिरता बहुत उपयोगी नहीं है": पीसी सॉफ़्टवेयर के बारे में नहीं जानते, लेकिन एम्बेडेड सिस्टम में, हार्डवेयर हार्डवेयर या चर घोषित करने के लिए वे आवश्यक हैं जिन्हें इंटरप्ट्स में बदला जा सकता है। –

+0

बहुत अच्छा मुद्दा! मेरे आखिरी एम्बेडेड प्रोजेक्ट के बाद से कुछ सालों रहे हैं, इसलिए मैं इसे भूल गया। वैसे भी जो काम करता है क्योंकि यह लोड और स्टोर के लिए था। पीसी पर अधिकांश इंटरप्ट्स को भूलना आसान होता है क्योंकि वे ओएस एपीआई द्वारा दूर हो जाते हैं। –

2

मानक here के माध्यम से पढ़ना, ऐसा लगता है कि पॉइंटर अस्थिर है, लेकिन संरचना की वास्तविक सामग्री नहीं है। मैंने व्याख्या की है कि दिए गए उदाहरण से, const t * volatile p (लिंक के नीचे)। यह है मैं बस क्या है

struct foo { 
    int bar; 
}; 

struct foo *volatile x; 

ध्यान दें कि मैं इस प्रयास नहीं किया है, इसलिए मैं बेतहाशा गलत हो सकता है ...: शब्दों, हालांकि, अस्पष्ट है, लेकिन मुझे लगता है कि यह एक ऐसी ही उदाहरण होगा मानक के एक कर्सर रीड-थ्रू से एकत्र हुए।

इसके अलावा, सीडीसीएल कुछ अस्पष्टता को साफ़ करता है।उदाहरण के लिए:

cdecl> समझाने struct x* volatile foo
घोषित foo के रूप में अस्थिर:

cdecl> x

जबकि अस्थिर struct को समझाने सूचक के रूप में volatile struct x* foo
घोषित foo सूचकांक के लिए सूचक x

एक उदाहरण में, संरचना अस्थिर है। दूसरे में, सूचक।

+1

तो आप बस अस्थिर संरचना x * अस्थिर फू नहीं कर सकते; एक अस्थिर सूचक और संरचना के लिए? – Earlz

+0

@earlz: हां। ठीक ठीक। अस्थिर संरचना एक्स * अस्थिर फू एक अस्थिर संरचना एक्स के लिए एक अस्थिर सूचक है। – FreeMemory

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