2014-11-05 12 views
9

मैं लिख रहा हूँ और एक स्मृति नक्शे से रजिस्टरों पढ़ने, इस तरह में इस्तेमाल किया सूचक:चेतावनी: प्रकार की 'शून्य *' अंकगणित

warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith] 
:

//READ 
return *((volatile uint32_t *) (map + offset)); 

//WRITE 
*((volatile uint32_t *) (map + offset)) = value; 

हालांकि संकलक मुझे इस तरह चेतावनी देता है

चेतावनियों को हटाने के लिए मैं अपना कोड कैसे बदल सकता हूं? मैं सी ++ और लिनक्स का उपयोग कर रहा हूँ।

+3

डाली - यह सोचते हैं आप चाहते हैं * बाइट * ऑफसेट: आप इस के लिए uint8_t उपयोग कर सकते हैं। क्या आप? –

+0

हां यह सही नक्शा शून्य है *, धन्यवाद। – user1876942

+0

आपको एक प्रकार के आकार के लिए 'पॉइंटर' को पॉइंटर पर डालना होगा। आकार 1 के मानक के द्वारा गारंटीकृत एकमात्र प्रकार 'char' है, इसलिए आपको इसे 'char *' पर डालना होगा। –

उत्तर

6

टाइप शून्य अपूर्ण प्रकार है। इसका आकार अज्ञात है। तो प्वाइंटर्स के साथ पॉइंटर अंकगणित शून्य का कोई मतलब नहीं है। आपको पॉइंटर को किसी अन्य प्रकार के पॉइंटर पर शून्य टाइप करने के लिए डालना होगा उदाहरण के लिए चार को पॉइंटर के लिए। यह भी ध्यान रखें कि आप क्वालीफायर अस्थिर के साथ घोषित ऑब्जेक्ट असाइन नहीं कर सकते हैं।

15

चूंकि void* अज्ञात प्रकार का सूचक है, आप उस पर पॉइंटर अंकगणित नहीं कर सकते हैं, क्योंकि संकलक यह नहीं जानता कि बात कितनी बड़ी है।

आपकी सर्वश्रेष्ठ शर्त map को एक बाइट चौड़ा है और फिर अंकगणित करने के लिए है। करने के लिए `चार *`

//READ 
return *((volatile uint32_t *) (((uint8_t*)map) + offset)); 

//WRITE 
*((volatile uint32_t *) (((uint8_t*)map)+ offset)) = value; 
+0

लेकिन शून्य * एक प्रसिद्ध प्रकार है, यह एक पता प्रकार है, यह किसी भी पता प्रकार को इंगित कर सकता है ... मुझे लगता है कि समाधान स्थिर है इसे uintptr_t * पर डालने के लिए, फिर – Dmitry

+1

यह 'char' पर डालने के लिए और अधिक मूर्खतापूर्ण होगा ', 'आकार (char)' के रूप में परिभाषित किया गया है 1। – Artyer

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