2009-09-04 12 views
5

मैं अपने आवेदन का एक पोर्टेबल इम्प्लेमेनेशन करना चाहता हूं। हालांकि, मैंने सुना है कि कुछ मशीनों पर stdlib से printf के साथ कुछ समस्याएं हैं जहां यह इरादे से व्यवहार नहीं करता है। उदाहरण के लिए, रूपांतरण निर्दिष्टकर्ता % f का उपयोग करते समय यह हो सकता है कि कुछ आर्किटेक्चर पर printf कार्यान्वयन आउटपुट में दशमलव बिंदु शामिल है!टेस्ट प्रिंटफ कार्यान्वयन

अब मुझे आश्चर्य है, अगर वहां कुछ परीक्षण दिनचर्या हो सकती हैं जो मैं stdlib c कार्यान्वयन की अर्थपूर्ण शुद्धता का परीक्षण करने के लिए उपयोग कर सकता हूं, विशेष रूप से printf दिनचर्या। हो सकता है कि कुछ अच्छे संसाधन हैं जो कार्यक्रमों को पोर्ट करते समय कुछ मुद्दों को इंगित करते हैं?

बहुत धन्यवाद, हाइन्ज़

+0

क्या उत्पादन में दशमलव बिंदु के साथ गलत क्या है? आईएमओ यह पोर्टेबिलिटी की तुलना में l10n से अधिक संबंधित है। –

+0

जब आप इसे परीक्षण के लिए उपयोग करते हैं, तो आप मूल रूप से विभिन्न प्लेटफ़ॉर्म पर अलग-अलग आउटपुट प्राप्त करते हैं; इसका मतलब यह हो सकता है कि दशमलव बिंदु की वजह से एक परीक्षण विफल हो सकता है क्योंकि एक अलग प्रतिशोध होता है हालांकि मान स्वयं समान होते हैं। –

+3

@ हेनज़, आप लोकेल को अपने परीक्षण कोड में "सी" पर सेट कर सकते हैं (यानी सेटलोकेल (एलसी_NUMERICAL, "सी"))। यह हमेशा एक दशमलव बिंदु आउटपुट करना चाहिए, न कि अल्पविराम या कुछ और। – quinmars

उत्तर

1

आप अपनी खुद की टेस्ट स्वीट कि समस्याओं पर चिंता का विषय को शामिल किया गया लिखना चाहिए। अलग-अलग इनपुट के साथ 100 बार printf को कॉल करना बहुत आसान है, और आउटपुट सरल टेक्स्ट है, इसलिए आपके द्वारा अपेक्षित आउटपुट के विरुद्ध जांच करना आसान है।

4

मुझे लगता है कि Postel's law ("आप जो करते हैं उसमें रूढ़िवादी रहें, जो आप दूसरों से स्वीकार करते हैं, में उदार रहें") यहां भी लागू होता है। काम करने के लिए printf() कार्यान्वयन पर विचार करने के लिए एक चरित्र-दर-चरित्र मिलान की आवश्यकता के लिए अपने परीक्षण न लिखें।

इसके बजाय, इसे एक उच्च स्तर पर करें; अपेक्षित डेटाटाइप में printf() द्वारा पाठ आउटपुट को पार्स करें, और उस प्रकार के मान के विरुद्ध तुलना करें।

आईई, अगर प्रिंटिंग "2.25", पाठ को पार्स करें (strtod() या समकक्ष का उपयोग करके) और वास्तविक संख्या 2.25 के साथ तुलना करें, शाब्दिक पाठ स्ट्रिंग "2.25" नहीं।

0

मैं इसे निम्न तरीके से जांचने की अनुशंसा करता हूं: कुछ परीक्षण टेम्पलेट्स का उत्पादन करने के लिए sprintf() का उपयोग करें और उन्हें अपने "सही" से तुलना करें।

मैंने fprintf का उपयोग करके ऐसा कुछ किया (बस हमारे एम्बेडेड सिस्टम में कैशिंग से बचने के लिए)।

मुझे लगता है कि परिणाम printf और sprintf के लिए अलग नहीं होंगे: स्वरूपण एल्गोरिदम समान है।

+0

एल्गोरिदम समान हैं क्योंकि ज्यादातर मामलों में सभी printf परिवार एक सामान्य कार्यान्वयन का उपयोग करता है। एक पारिवारिक सदस्य की तुलना किसी अन्य व्यक्ति की तुलना में ही पुष्टि होगी कि उन्हें एक ही जवाब मिल गया है, लेकिन यह तय करने में सहायता नहीं है कि यह सही उत्तर है या नहीं। – RBerteig

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