सबसे पहले, यदि आप func
(इसके स्रोत को संशोधित करने की अनुमति है) को ठीक कर सकते हैं, तो इसे ठीक करें। यदि इसकी गणना पॉइंटर्स के साथ की जा सकती है, तो उन्हें पॉइंटर्स और रिटर्न पॉइंटर्स के साथ करें। कभी-कभी पते के साथ पूर्णांक के रूप में काम करने के वैध कारण होते हैं (उदाहरण के लिए, विशेष कोड में संरेखण के मुद्दों से निपटना)। उस स्थिति में, uintptr_t
प्रकार (stdint.h
में परिभाषित) का उपयोग करने के लिए func
बदलें। यह आवश्यक होने पर पॉइंटर्स को पूर्णांक के रूप में इलाज के लिए डिज़ाइन किया गया है। (intptr_t
भी है यदि हस्ताक्षर किए गए अंकगणित किसी कारण से बेहतर है, लेकिन मुझे आमतौर पर कम परेशानी होने के लिए हस्ताक्षर किए गए uintptr_t
मिलते हैं।) पसंदीदा रूप से, func
को uintptr_t
को लौटने पर पॉइंटर में कनवर्ट करना चाहिए, इसलिए func
का रिटर्न प्रकार एक पॉइंटर होगा (कुछ, शायद some_struct
या void
)।
यदि आप func
को ठीक नहीं कर सकते हैं, तो आप उस कंपाइलर को बताने के लिए कह सकते हैं कि आप किए जा रहे रूपांतरणों का इरादा रखते हैं। हालांकि, यह विशेष त्रुटि संदेश आपको बता रहा है कि आप केवल एक सूचक को पूर्णांक में परिवर्तित नहीं कर रहे हैं, लेकिन आप एक आकार (उदा।, चार बाइट्स) के एक पूर्णांक को दूसरे आकार के सूचक (उदाहरण के लिए, आठ बाइट्स) में परिवर्तित कर रहे हैं। ऐसा लगता है कि यह कोड मूल रूप से एक सिस्टम के लिए लिखा गया था जहां func
द्वारा पूर्णांक प्रकार का आयाम सूचक आकार के समान आकार था, लेकिन अब आप उस सिस्टम पर संकलन कर रहे हैं जहां सूचक प्रकार उस पूर्णांक आकार से बड़ा या कम है।
उस स्थिति में, आपको यह सुनिश्चित करना होगा कि func
द्वारा की गई गणना नई वास्तुकला में काम करती है। यदि यह केवल 32-बिट मान लौटा रहा है, तो क्या वह हमेशा सही मान रखेगा? यही है, लापता उच्च 32 बिट्स से कुछ भी खो जाएगा? कोई पता नहीं है कि func
गणना करना चाहिए कि यह कभी भी पूर्णांक प्रकार के अधिकतम मान से अधिक है? यदि func
हस्ताक्षरित पूर्णांक प्रकारों का उपयोग कर रहा है, तो साइन बिट पर भी विचार करें।
यदि आपने यह सुनिश्चित किया है कि func
द्वारा लौटाया गया मूल्य सही है, तो आप स्पष्ट कारणों का उपयोग कर सकते हैं, जैसे: some_struct *ptr = (some_struct *) (intptr_t) func();
।
स्रोत
2012-08-03 13:51:20
आप एक संरचना सूचक में एक पूर्णांक क्यों रखना चाहते हैं? – Jay
यह संभव है, लेकिन जिन मामलों में यह जाने का सही तरीका है दुर्लभ हैं। –
"आउटपुट" differencies के अधिभार है? (इनपुट पैरामीटर नहीं) –