2011-02-02 9 views
10

कार्य करने के लिए अस्थिर पॉइंटर घोषित करें सी में कार्य करने के लिए पॉइंटर घोषित करने के लिए, ताकि पॉइंटर स्वयं अस्थिर हो।सी:

static void volatile (* f_pointer)(void*); 

static void (volatile * f_pointer)(void*); 

static void (* volatile f_pointer)(void*); 

मैं यह क्यों पूछ रहा हूं? मैंने अस्थिर पॉइंटर्स के बारे में http://wiki.answers.com/Q/Volatile_example_code_sample_coding_of_volatile_pointer पर पढ़ा।

वहाँ कभी कभी अस्थिर संकेत और के साथ समस्याएं हैं अस्थिर सूचक-टू:

अब, यह पता चला है कि अस्थिर चर के संकेत बहुत आम हैं। इन घोषणाओं के दोनों foo घोषित एक अस्थिर पूर्णांक के लिए सूचक होने के लिए: गैर अस्थिर चर के

volatile int * foo; 
int volatile * foo; 

वाष्पशील संकेत बहुत ही दुर्लभ (मुझे लगता है कि मैं उन्हें एक बार उपयोग किया है), हैं लेकिन मैं बेहतर आगे जाना है और आप वाक्य रचना देना चाहते हैं:

int * volatile foo; 

तो, मैं एक सूचक को "अस्थिर" समारोह नहीं कार्य करने के लिए एक अस्थिर सूचक प्राप्त करना चाहते हैं।

धन्यवाद

+4

आप एक अस्थिर सूचक को फ़ंक्शन में क्यों चाहते हैं? इस सूचक को बदलने वाला कौन है? क्या आप जानते हैं कि 'अस्थिर' _really_ का क्या अर्थ है? –

+0

@ जेम्स मैकनेलिस, हाँ, मैं चाहता हूं। यह पॉइंटर थ्रेड 0 द्वारा बदला जाता है और फ़ंक्शन शुरू करने के लिए थ्रेड 1..7 द्वारा उपयोग किया जाता है।इसके बीच बाधा है, लेकिन मैं बाधा डालने से पहले इस सूचक को थ्रेड 0 में मेमोरी में फ्लश करने के लिए चाहता हूं। इसके अलावा मैं इस सूचक को फिर से पढ़ने के लिए धागे 1..7 चाहता हूं ('{बाधा, सूचक पढ़ने, कॉलिंग फ़ंक्शन} का एक लूप है)। मैं कई रजिस्टरों के साथ एक सिस्टम का उपयोग करता हूं, इसलिए कंपाइलर बहुत सारे चर को कैश कर सकता है। क्या मैं सही हू? – osgx

+0

यदि बाधा सही ढंग से लिखा गया है, तो संकलक को इसके मूल्यों को कैशिंग नहीं करना चाहिए - 'अस्थिर' अनावश्यक होना चाहिए। – caf

उत्तर

11

Think। क्वालिफायर (const या volatile) तारांकन की तुलना में परिवर्तनीय नाम के करीब पॉइंटर को संशोधित करता है। क्वालिफायर तारकीय नाम से परिवर्तनीय नाम से आगे का तरीका संशोधित करता है कि सूचक क्या संदर्भित करेगा। इस मामले में, इसलिए, आप होगा:

static void * volatile f_pointer(void *); 

छोड़कर जाहिर है, यह है कि आप कोष्ठक जरूरत है एक सूचक वाला फ़ंक्शन घोषित करने के बजाय एक समारोह के लिए एक सूचक को परिभाषित करने के:

static void (*volatile f_pointer)(void *); 

static क्वालीफायर की बजाय स्टोरेज क्लास है, इसलिए इसके मामले में सच नहीं है। आप केवल वैरिएबल के लिए स्टोरेज क्लास निर्दिष्ट कर सकते हैं, न कि यह क्या इंगित करता है। "बाहरी int के लिए सूचक" या "स्थैतिक int के सूचक" के रूप में ऐसी कोई चीज़ नहीं है, केवल "int to pointer"। यदि आप एक स्टोरेज क्लास (static या extern) निर्दिष्ट करते हैं, तो यह हमेशा पहले आता है।

अन्य threads सूत्रण और volatile के बीच संबंधों पर चर्चा की है तो मैं यह देखते हुए कि इस शायद उपयोगी नहीं होगी परे है कि यहां दोहराना नहीं होगा।

9

cdecl समस्या की इस तरह के लिए वास्तव में काम में आता:

$ cdecl 
Type `help' or `?' for help 
cdecl> declare f_pointer as static volatile pointer to function(pointer to void) returning void 
static void (* volatile f_pointer)(void *) 
cdecl> 

cdecl के स्रोत: एक "बाधा" के रूप में तारांकन के http://cdecl.org/files/cdecl-blocks-2.5.tar.gz

+2

@osgx - http://cdecl.org/ –

+0

@osgx पर एक ऑनलाइन संस्करण है, इसमें बहुत से विकास वातावरण शामिल हैं। मुझे स्रोत से मेरा निर्माण याद रखना प्रतीत होता है, लेकिन मुझे याद नहीं है कि मुझे यह कहां मिला। आप इसे http://cdecl.org/ पर ऑनलाइन उपयोग कर सकते हैं। –

+0

धन्यवाद! क्या आप कुछ आईडीई नाम दे सकते हैं, जिसमें सीडीईसीएल शामिल है? (मुझे लगता है कि सीडीईएल के साथ एनई आईडीई बहुत उपयोगकर्ता के अनुकूल होना चाहिए) – osgx