2012-02-20 23 views
5

जब जीसीसी मैं निम्नलिखित चेतावनी मिलती है साथ मेरे कार्यक्रम के संकलन के लिए संक्षिप्त रूप है क्या: बस के आसपास खेल करसी लंबे अहस्ताक्षरित int

format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int 

अब मुझे पता% लो चेतावनी ठीक करता है। हालांकि मैं वास्तव में समझ में नहीं आता कि मैं क्या कर रहा हूं।

क्या एक प्रकार का संक्षिप्त रूप प्राप्त करने के लिए नामकरण सम्मेलन है? उदाहरण के लिए, int% d है, क्यों ??

धन्यवाद!

+0

प्रलेखन हमेशा एक अच्छी शुरुआत है: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ –

उत्तर

1

हालांकि मैं वास्तव में समझ नहीं पा रहा हूं कि मैं क्या कर रहा हूं।

आप क्या कर रहे हैं printf फ़ंक्शन स्ट्रिंग के बाद प्रदान किए गए डेटा को प्रदर्शित करने के तरीके को बता रहा है। आपको शायद पता चलेगा कि %lo वास्तव में आपके द्वारा अपेक्षित परिणामों को प्रिंट नहीं करता है - यह सही डेटा प्रिंट करता है, लेकिन ऑक्टल (बेस 8) प्रारूप में।

क्या कोई प्रकार का संक्षिप्त रूप प्राप्त करने के लिए नामकरण सम्मेलन है? उदाहरण के लिए, int% d है, क्यों ??

"लघु रूप" को प्रारूप विनिर्देशक कहा जाता है। कोई सम्मेलन नहीं है जो आपको उपयुक्त प्रिंटफ प्रारूप विनिर्देश प्राप्त करने देता है। आपको बस look them up in an appropriate reference होना है।

22
long unsigned int = unsigned long 

आप प्रिंट करने के लिए %lu का उपयोग करते हैं।

और इसी तरह, %lluunsigned long long के लिए है।


%d - int 
%u - unsigned 
%ld - long 
%lld - long long 
%lu - unsigned long 
%llu - unsigned long long 
3

नहीं, सम्मेलन है, तो आप बस look at the documentation की जरूरत है।

और प्रारूपण विनिर्देशक इस प्रकार के 1: 1 मैपिंग नहीं हैं, वे आउटपुट प्रारूप (इसलिए नाम) को नियंत्रित करते हैं। एक इनपुट इनपुट प्रकार के लिए कई आउटपुट प्रारूप हो सकते हैं।

उदाहरण के लिए, %d "दशमलव" है, क्योंकि यह दशमलव संख्या के रूप में एक पूर्णांक मुद्रित करता है। %i ("पूर्णांक") भी है जो बिल्कुल वही काम करता है।

unsigned int मानों के लिए, आपके पास %x (हेक्साडेसिमल में प्रिंट) और %u (ऑक्टल में प्रिंट) दोनों हैं।

+1

दरअसल,% x एक हस्ताक्षरित पूर्णांक की अपेक्षा करता है, हस्ताक्षरित नहीं ... –

+0

@RichardJ। RossIII: अच्छा पकड़, धन्यवाद। मुझे लगता है कि मुझे अपनी सलाह थोड़ा और अधिक लेनी चाहिए, ऐसा लगता है। फिक्स्ड। – unwind

3

int, long, आदि की परिभाषा लक्ष्य के लिए विशिष्ट हैं। यदि पूर्णांक और लंबे समय तक मैच का आकार तो एक

printf("%d",var); 

अभ्यस्त शिकायत करते हैं, लेकिन अगर लंबा है 64 बिट्स का कहना है और पूर्णांक एक उदाहरण के रूप 32 बिट है, तो आप चेतावनी/त्रुटि आप का वर्णन मिल जाएगा। दो समाधान में से एक:

printf("%ld",var); 
or 
printf("%d",(int)var); 

आप बीमा करने के लिए है कि संकलक सहयोगियों,% d आकार के साथ int अगर आप अभी तक एक और चेतावनी तो उसके अनुसार समायोजित मिलता है निश्चित रूप से पिछले के लिए।

संपादित करें:

संकलक, आप मदद करने के लिए सी पुस्तकालय सामान जो वास्तव में संकलक का व्यवसाय नहीं है के बारे में चिंता से कोशिश कर रहा है। printf() तर्कों की एक चर संख्या का उपयोग करता है, जो उम्मीद है कि आप अपनी प्रारूप स्ट्रिंग से ठीक से मेल खाते हैं। जब printf एक 32 बिट सिस्टम पर% d देखता है तो यह संभवतः अगले 32 बिट तर्क को पकड़ लेगा। लेकिन अगर आपने एक पैरामीटर के रूप में 64 बिट पूर्णांक डाला है तो यह उस पूर्णांक का एक आधा हिस्सा ले सकता है, और दूसरे आधे को प्रारूप स्ट्रिंग में अगले आइटम के रूप में उपयोग कर सकता है। उदाहरण

unsigned long ul; 
float f; 

f=3.4; 
ul=0x3F9DF3B612345678; 
... 
printf("%X %f\n",ul,f); 

के लिए अपने सिस्टम, endianess, पर निर्भर करता है आदि, एक 32 बिट प्रणाली आप बिल्कुल नहीं हैरान करता है, तो ऊपर दिए गए कोड इस उत्पादन का उत्पादन किया जाना चाहिए:

12345678 1.234000 

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

अब किसी विशेष दिन पर लक्ष्य प्रणाली पर कंपाइलर के आधार पर आपके पास उपरोक्त कोड काम वांछित के रूप में हो सकता है, एक सिस्टम/कंपाइलर लें जहां 32 बिट के रूप में अनगिनत लंबे समय तक व्याख्या की जाती है और% X को 32 बिट के रूप में व्याख्या किया जाता है, तो आपको 64 बिट असाइनमेंट के बारे में चेतावनी मिलती है लेकिन प्रिंटफ थोड़ा और अधिक समझ में आता है।

इस दर्द के कारण, जीसीसी जैसे कंपाइलर्स यह मानकर अपने जीवन को बेहतर बनाने की कोशिश करते हैं कि जब आप printf() नामक फ़ंक्शन का उपयोग करते हैं तो आप मानक सी का उपयोग कर रहे हैं और वे इन प्रकारों की तलाश में आपकी प्रारूप स्ट्रिंग के माध्यम से विश्लेषण करते हैं सामान्य गलतियों का।

+1

+1, यह एक शर्म की बात है कि इस तरह के देर से उत्तर देने वाले अपवर्तकों को प्राप्त नहीं करते हैं। – Mysticial

0

% lo = octal अंकों में मुद्रित unsigned लंबे पूर्णांक। हां, दस्तावेज़ शुरू करने के लिए एक अच्छी जगह है .. लेकिन somethings में एक पैटर्न है, जैसे ओ ऑक्टल के लिए, हेक्स के लिए एक्स, एल कुछ भी लंबे समय के लिए आदि। ऐसे कई प्रारूप विनिर्देशकों के लिए उपयोग करने से आपको पैटर्न कहीं भी प्राप्त करने में मदद मिलेगी।

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