यह स्ट्रिंग में int (हस्ताक्षरित 16-बिट पूर्णांक) को परिवर्तित करने के लिए गति-अनुकूलित समाधान है।
यह कार्यान्वयन डिवीजन का उपयोग करने से बचाता है क्योंकि 8-बिट एवीआर के लिए उपयोग किया जाता है क्योंकि Arduino के पास कोई हार्डवेयर डीआईवी निर्देश नहीं है, संकलक समय-उपभोग करने वाले पुनरावर्तक घटाव में विभाजन का अनुवाद करता है। इस प्रकार सबसे तेज़ समाधान स्ट्रिंग बनाने के लिए सशर्त शाखाओं का उपयोग कर रहा है।
गतिशील आवंटन से बचने के लिए रैम में शुरुआत से तैयार एक निश्चित 7 बाइट बफर तैयार किया गया। चूंकि यह केवल 7 बाइट्स है, इसलिए निश्चित RAM उपयोग की लागत को न्यूनतम माना जाता है। कंपाइलर की सहायता के लिए, हम स्पीड-अप निष्पादन के लिए परिवर्तनीय घोषणा में रजिस्टर संशोधक जोड़ते हैं।
char _int2str[7];
char* int2str(register int i) {
register unsigned char L = 1;
register char c;
register boolean m = false;
register char b; // lower-byte of i
// negative
if (i < 0) {
_int2str[ 0 ] = '-';
i = -i;
}
else L = 0;
// ten-thousands
if(i > 9999) {
c = i < 20000 ? 1
: i < 30000 ? 2
: 3;
_int2str[ L++ ] = c + 48;
i -= c * 10000;
m = true;
}
// thousands
if(i > 999) {
c = i < 5000
? (i < 3000
? (i < 2000 ? 1 : 2)
: i < 4000 ? 3 : 4
)
: i < 8000
? (i < 6000
? 5
: i < 7000 ? 6 : 7
)
: i < 9000 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 1000;
m = true;
}
else if(m) _int2str[ L++ ] = '0';
// hundreds
if(i > 99) {
c = i < 500
? (i < 300
? (i < 200 ? 1 : 2)
: i < 400 ? 3 : 4
)
: i < 800
? (i < 600
? 5
: i < 700 ? 6 : 7
)
: i < 900 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 100;
m = true;
}
else if(m) _int2str[ L++ ] = '0';
// decades (check on lower byte to optimize code)
b = char(i);
if(b > 9) {
c = b < 50
? (b < 30
? (b < 20 ? 1 : 2)
: b < 40 ? 3 : 4
)
: b < 80
? (i < 60
? 5
: i < 70 ? 6 : 7
)
: i < 90 ? 8 : 9;
_int2str[ L++ ] = c + 48;
b -= c * 10;
m = true;
}
else if(m) _int2str[ L++ ] = '0';
// last digit
_int2str[ L++ ] = b + 48;
// null terminator
_int2str[ L ] = 0;
return _int2str;
}
// Usage example:
int i = -12345;
char* s;
void setup() {
s = int2str(i);
}
void loop() {}
यह स्केच AVR-जीसीसी जो Arduino v1.0.5 के साथ बंडल (int2str समारोह के आकार में ही 594 बाइट्स) का उपयोग कर कोड के 1,082 बाइट्स संकलित किया गया है। 2,398 बाइट्स में संकलित स्ट्रिंग ऑब्जेक्ट का उपयोग करके समाधान के मुकाबले, यह कार्यान्वयन आपके कोड आकार को 1.2 Kb तक कम कर सकता है (माना जाता है कि आपको किसी अन्य स्ट्रिंग की ऑब्जेक्ट विधि की आवश्यकता नहीं है, और आपका नंबर हस्ताक्षरित int प्रकार पर सख्त है)।
यह फ़ंक्शन इसे उचित असेंबलर कोड में लिखकर अनुकूलित किया जा सकता है।
नहीं Arduino पर sprintf? – Pubby
? यहां पर सभी टिप्पणियां चली गईं .... क्या हुआ? – user947659
@ पब्बी "printf() आपके निष्पादन योग्य ऑब्जेक्ट को ~ 1000 बाइट्स बड़ा बनाता है, इसलिए यदि आकार एक समस्या है तो आप इसका उपयोग नहीं करना चाहेंगे।" http://playground.arduino.cc/Main/Printf –