2013-06-17 3 views
11
volatile uint8_t reset_mask[768] = {0} 

अब मैं आंतरिक संचालन के दौरान इस सरणी तत्वों के मानों को 1 पर सेट कर रहा हूं।memset का उपयोग कर अस्थिर सरणी को शून्य पर कैसे सेट करें?

एक और कार्यात्मक कॉल में, मैं 0. एक तरह से करने के लिए इस सरणी के सभी तत्वों को निर्धारित करने की आवश्यकता पाश के लिए उपयोग करना है, लेकिन मेरा मानना ​​है कि memset

memset(reset_mask, 0, sizeof(reset_mask)); 
का उपयोग करके सरणी के सभी तत्वों को आवंटित करने के लिए बेहतर तरीका है

लेकिन मैं इस त्रुटि हो रही है: -

" 'शून्य *' टाइप करने के लिए दूर क्वालिफायर डाले 'अस्थिर uint8_t * {उर्फ अस्थिर अहस्ताक्षरित चार *}' प्रकार से डाली" मामले हम यहाँ memset उपयोग नहीं कर सकते में , है इस अस्थिर सरणी के सभी तत्वों को एक बार में सेट करने का एक बेहतर तरीका है?

+6

'std :: fill (std :: start (reset_mask), std :: end (reset_mask), 0); 'काम करता है। –

+0

@ आर। मार्टिनिन्हो फर्नांडीस यह एक उत्तर होना चाहिए (क्योंकि यह वास्तव में एकमात्र सही उत्तर है)। सी में, ज़ाहिर है, उसे अपने लूप का उपयोग करना होगा। –

+0

आप अस्थिर सरणी का उपयोग किसके लिए कर रहे हैं? आपको कुछ/सभी इंटरप्ट अक्षम करना पड़ सकता है? –

उत्तर

-3

बेशक आप मेमसेट का उपयोग करने में सक्षम होना चाहिए। यह मुझे कास्टिंग प्रकार की एक समस्या प्रतीत होता है। सी की तुलना में, सी ++ प्रकारों का उपयोग होने पर काफी प्रतिबंधित है। फ़ंक्शन मेमसेट को शून्य * प्राप्त करने की उम्मीद है, लेकिन आप uint8_t * की आपूर्ति कर रहे हैं। यह कास्टिंग का प्रयास करें:

memset (static_cast<void *>(reset_mask), 0, size_of(reset_mask)); 

कास्टिंग बारे में अधिक जानकारी के लिए इस जाँच:

Regular cast vs. static_cast vs. dynamic_cast

सादर

संपादित करें: मैं लापता कोष्टक जोड़ लिया है। मैंने वैसे भी इसका परीक्षण नहीं किया है, हालांकि मुझे लगता है कि इसे काम करना चाहिए।

+6

एक 'अस्थिर' क्वालीफायर को अपरिभाषित व्यवहार को कास्ट करना (अनुमान लगाना मुश्किल नहीं है कि अगर आपको पता है कि 'अस्थिर' क्या करता है)। (और यदि यह अच्छी तरह से परिभाषित किया गया था, तो भी 'static_cast' ऐसा नहीं कर सकता; आपको' const_cast' 'की आवश्यकता होगी) –

6

आप memsetconst_cast के साथ अस्थिरता कास्टिंग कर सकते हैं, लेकिन यह अस्थिर अर्थशास्त्र को हटा देगा। तो जब तक कि यह आपके लिए ठीक नहीं है, आप लूप संस्करण के साथ अटक गए हैं। जब तक आपका कार्यान्वयन आपको मेमसेट का संस्करण नहीं देता है जो अस्थिर * लेता है और आपके काम को करने के लिए दस्तावेज किया जाता है। (मैं संभावना नहीं बाहर एम्बेडेड सिस्टम लगता है कि, यहां तक ​​कि वहाँ मुझे आश्चर्य होगा।)

2

रूप बलॉग पाल ने कहा, दूर volatile कास्टिंग memset टूटता volatile अर्थ विज्ञान कॉल करने के लिए। पूरे memset को अनुकूलित किया जा सकता है, या अपरिभाषित व्यवहार बुराई होती है।

या तो सरणी को शून्य करने के लिए अपने स्वयं के पाश लिखते हैं, या इस memset_volatile का उपयोग करें:

void memset_volatile(volatile void *s, char c, size_t n) 
{ 
    volatile char *p = s; 
    while (n-- > 0) { 
     *p++ = c; 
    } 
} 

असली memset भी रिटर्न s और c एक int है, लेकिन इस संस्करण मेरे लिए क्लीनर है।

यह स्पष्ट नहीं है कि संकलक को इस फ़ंक्शन को एक बार में एक से अधिक बाइट लिखने के लिए अनुकूलित करने की अनुमति है, इसलिए यदि सरणी बहुत बड़ी है तो यह थोड़ा धीमा हो सकता है।

+1

इस स्निपेट के लिए धन्यवाद! –

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