2012-10-25 30 views
7

संकलित करने के बाद कोड आकार बहुत बड़ा है I एम्बेडेड सिस्टम (कॉर्टेक्स एम 3) विकसित करने पर काम कर रहा हूं। डिवाइस से सीरियल पोर्ट (पीसी स्क्रीन पर दिखाने के लिए) से कुछ डेटा भेजने के लिए, मैं putchar() विधि का उपयोग करके अपने स्वयं के कार्यों का उपयोग करता हूं।सी में sprintf() के बजाय कोई फ़ंक्शन?

जब मैं पूर्णांक या नाव भेजना चाहते हैं, मैं उन्हें वर्णों की स्ट्रिंग में बदलने के लिए में sprintf() का उपयोग करें और उन्हें सीरियल पोर्ट के लिए भेज दिया।

अब, समस्या यह है कि मैं किल यूविजन आईडीई का उपयोग कर रहा हूं और यह अधिकतम 32 केबी के साथ सीमित संस्करण है। जब भी मैं विभिन्न कार्यों में sprintf() को कॉल करता हूं, मुझे नहीं पता कि संकलन के बाद कोड का आकार बहुत अधिक बढ़ गया है। मैंने अब 32 केबी को पार कर लिया है और मुझे आश्चर्य है कि मुझे अपने कुछ कार्यों को बदलना है और sprintf के बजाय कुछ और उपयोग करना है!

कोई सुराग?

+7

सभी के बाद 'फ्लोट' से बचने की कोशिश करें, क्योंकि उनके रनटाइम लाइब्रेरी घटक ज्यादातर मामलों में काफी बड़े और धीमे होते हैं। – glglgl

+1

printf परिवार बहुत महंगा है क्योंकि इसे लागू करने के लिए आवश्यक बड़ी मात्रा में कोड, एएसपी फ्लोटिंग पॉइंट। एक पूर्णांक केवल printf एक उचित राशि है लेकिन अभी भी महंगा है। क्या आपको सचमुच लगता है कि आपको अपने एम्बेडेड माइक्रोकंट्रोलर कोड में printf() की आवश्यकता है? आप अपने स्वयं के सस्ता समाधान लागू कर सकते हैं। –

+0

अपने कंपाइलर विक्रेताओं को उपलब्ध पुस्तकालयों को भी देखें। कार्यक्षमता कम होने के साथ अक्सर सी std libs के कई स्वाद होगा। उदाहरण के लिए, एक स्प्रिंटफ जो int और float को संभालती है, लेकिन वैज्ञानिक नोटेशन नहीं। –

उत्तर

0

आप itoa() या ftoa() कोशिश करते हैं और लागू इन आपके requirement.I के रूप में मतलब है के रूप में वे सिर्फ परिभाषा के अंदर पात्रों के लिए उन कन्वर्ट ही putchar() का उपयोग सीधे प्रिंट कर सकते हैं।

यह काम करना चाहिए, मुझे लगता है।

+3

इटाओ नामक कोई फ़ंक्शन नहीं है और न ही सी भाषा में ftoa कहा जाता है। – Lundin

+0

@ लुंडिन: आपकी आवश्यकता के रूप में लिखा जा सकता है ... या इन फ़ाइलों को शामिल करें ... itoa और ftoa इन हेडरफ़ाइल में हैं या Omkant

+0

सी में कोई itoa() और ftoi() नहीं है (मुझे नहीं पता कि यह वास्तव में सी ++ में मौजूद है) – Django

6

यदि आप इसे कुशल बनाना चाहते हैं, तो सबसे अच्छा तरीका शायद इसे स्वयं कोड करना है, या नेट पर इसके लिए पहले से ही लिखित कोड ढूंढना है। स्ट्रिंग रूपांतरण करने के लिए int हालांकि बहुत आसान है, हर प्रोग्रामर 30 मिनट से भी कम समय में लिख सकता है। स्ट्रिंग रूपांतरण के लिए फ़्लोट थोड़ा अधिक जटिल है और उपयोग किए जाने वाले फ़्लोटिंग पॉइंट प्रारूप पर निर्भर करता है।

सुविधा के लिए, यहाँ माइक्रोकंट्रोलर अनुप्रयोगों में इस्तेमाल के लिए एक सरल पूर्णांक-से-स्ट्रिंग एल्गोरिथ्म है:

void get_dec_str (uint8_t* str, size_t len, uint32_t val) 
{ 
    uint8_t i; 
    for(i=1; i<=len; i++) 
    { 
    str[len-i] = (uint8_t) ((val % 10UL) + '0'); 
    val/=10; 
    } 

    str[i-1] = '\0'; 
} 
+2

मुझे यकीन नहीं है कि अगर आपके माइक्रो में हार्डवेयर विभाजक नहीं है तो यह एक जंगली त्वरित/कुशल कार्य है ... (या मॉड्यूलस :)। हालांकि मेरे सिर के ऊपर से बेहतर विकल्प नहीं है! –

+3

@ मार्टिन थॉम्पसन मुझे यकीन नहीं है कि इसके बारे में बहुत कुछ कर सकता है, दशमलव 10-आधारित हैं, लेकिन कंप्यूटर 2/4/8/16/32-आधारित पसंद करते हैं। इसके अलावा मैं संकलक को अनुकूलन छोड़ दूंगा। – Lundin

+1

उचित टिप्पणी फिर से: संकलक –

9

दो संभावित प्रसाद (जिनमें से न तो मैं अपने आप को इस्तेमाल किया है - मेरी संकलक विक्रेताओं आमतौर पर आपूर्ति एक नीचे छीन लिया एम्बेडेड उपयोग) के लिए printf:

http://eprintf.sourceforge.net/ - [सितं, 2017: दुर्भाग्य से, दूर चला गया है लगता है, लेकिन स्रोत कोड अभी भी यहाँ: https://sourceforge.net/projects/eprintf/files/]

http://www.sparetimelabs.com/tinyprintf/index.html - 2 फाइलें, लगभग 1.4 केबी कोड। 'लम्बे' को सक्षम करने का विकल्प (अधिक कोड आकार का मतलब है)। अग्रणी शून्य और क्षेत्र चौड़ाई का समर्थन करता है। कोई फ्लोटिंग पॉइंट समर्थन नहीं।

+1

पर अनुकूलन छोड़कर चूंकि 'eprintf' वेबपृष्ठ के वास्तविक कोड से कोई लिंक नहीं है, इसलिए स्रोतforge eprintf प्रोजेक्ट का एक लिंक यहां दिया गया है: http://sourceforge.net/projects/eprintf/ –

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/1745 9 102) – StoryTeller

+0

@StoryTeller - आम तौर पर मैं सहमत हूं, लेकिन मुझे यकीन नहीं है कि सामग्री का सारांश मदद करता है अगर लिंक दूर हो जाएं (जैसा कि मैं एक में से एक देखता हूं उनके पास है :(- जब मैं सिर्फ एक सच्चे "उत्तर" के बजाय स्रोत कोड के लिंक की पेशकश कर रहा हूं। –