के साथ कचरा फ्लोट प्रिंट करता है मैं एआरएम कॉर्टेक्स-एम 3 (एसटीएम 32 एफ 205) के साथ एक नंगे धातु एम्बेडेड सिस्टम चला रहा हूं। जब मैं नाव की संख्या के साथ snprintf()
उपयोग करने के लिए, उदा .:स्नप्रिंटफ() न्यूबिल नैनो
float f;
f = 1.23;
snprintf(s, 20, "%5.2f", f);
कोशिश मैं s
में कचरा मिलता है। प्रारूप को सम्मानित किया जा रहा है, यानी कचरा अंक, दशमलव बिंदु, और दो पीछे वाले अंकों के साथ एक अच्छी तरह से बनाई गई स्ट्रिंग है। हालांकि, अगर मैं snprintf
दोहराता हूं, तो स्ट्रिंग दो कॉल के बीच बदल सकती है।
चल बिन्दु गणित अन्यथा काम करने के लिए लगता है, और snprintf
पूर्णांकों के साथ काम करता है, उदा .:
snprintf(s, 20, "%10d", 1234567);
मैं -u _printf_float
लिंकर स्विच के साथ newlib-nano
कार्यान्वयन का उपयोग करें। कंपाइलर arm-none-eabi-gcc
है।
मुझे मेमोरी आवंटन समस्याओं का एक मजबूत संदेह है, क्योंकि पूर्णांक बिना किसी हिचकी के मुद्रित होते हैं, लेकिन फ्लोट कार्य करता है जैसे कि वे प्रक्रिया में दूषित हो जाते हैं। printf
पारिवारिक फ़ंक्शंस फ्लोट के साथ malloc
पर कॉल करता है, पूर्णांक के साथ नहीं।
कोड newlib
से संबंधित नहीं मैं इस संदर्भ में उपयोग कर रहा हूँ का केवल कुछ भाग मेरी _sbrk()
, जो malloc
के लिए आवश्यक है है।
caddr_t _sbrk(int incr)
{
extern char _Heap_Begin; // Defined by the linker.
extern char _Heap_Limit; // Defined by the linker.
static char* current_heap_end;
char* current_block_address;
// first allocation
if (current_heap_end == 0)
current_heap_end = &_Heap_Begin;
current_block_address = current_heap_end;
// increment and align to 4-octet border
incr = (incr + 3) & (~3);
current_heap_end += incr;
// Overflow?
if (current_heap_end > &_Heap_Limit)
{
errno = ENOMEM;
current_heap_end = current_block_address;
return (caddr_t) - 1;
}
return (caddr_t)current_block_address;
}
जहां तक मैं ट्रैक करने में सक्षम हूं, यह काम करना चाहिए। ऐसा लगता है कि कोई भी इसे नकारात्मक वृद्धि के साथ कभी नहीं बुलाता है, लेकिन मुझे लगता है कि यह न्यूलिब malloc
के डिजाइन के कारण है। केवल थोड़ी सी अजीब चीज यह है कि _sbrk
पर पहली कॉल शून्य वृद्धि है। (लेकिन यह केवल malloc
की ढेर के शुरुआती पते के बारे में जिज्ञासा हो सकती है।)
ढेर ढेर के साथ टकरा नहीं होना चाहिए, क्योंकि दोनों के लिए लगभग 60 कीबी रैम है। लिंकर स्क्रिप्ट पागल हो सकती है, लेकिन कम से कम ढेर और ढेर पते सही लगते हैं।
ध्यान दें कि वे 'डबल' हैं, न कि 'फ्लोट' हैं। कोई फर्क नहीं पड़ता कि यह मायने रखता है, तो आप 'फ्लोट' को 'snprintf()' वैसे भी पास नहीं कर सकते हैं। – unwind
[snprintf() '] के लिए प्रोटोटाइप (http://pubs.opengroup.org/onlinepubs/9699919799/functions/snprintf.html) 'int snprintf (char * प्रतिबंधित s, size_t n, const char * प्रतिबंधित प्रारूप है , ...); 'आप प्रोटोटाइप के अनुसार फ़ंक्शन को कॉल नहीं कर रहे हैं। क्या आपने #'** शामिल किया है और सभी चेतावनियों के साथ संकलित ** **? – pmg
निश्चित रूप से आपका सच्चा कोड 'snprintf()' का उपयोग कर रहा है और 'sprintf() 'नहीं है? – chux