2012-03-23 8 views
12

मैं अपनी परियोजना के लिए एक पुस्तकालय लिख रहा हूं (अब के लिए मैं Arduino का उपयोग कर रहा हूँ)। मेरी समस्या यह है किसी ++ में और Arduino में भिन्न है।सी ++ तारों और Arduino स्ट्रिंग्स को कैसे गठबंधन करें?

यही है, मैं अपनी पुस्तकालय Arduino से स्वतंत्र होना चाहता हूं, इसलिए मैं #include <string> का उपयोग कर रहा हूं और बाद में string s; घोषित कर रहा हूं। हालांकि Arduino तारों में Arduino द्वारा परिभाषित किया गया है और String s2 घोषित किया गया है।

जब मैं अपनी लाइब्रेरी को स्केच में शामिल करता हूं तो मुझे उस लाइन पर error: string: No such file or directory मिलता है जहां मैं सी ++ स्ट्रिंग लाइब्रेरी (#include <string>) शामिल करने का प्रयास करता हूं।

क्या Arduino C++ स्ट्रिंग लाइब्रेरी का उपयोग करने का तरीका है, या संकलन करते समय स्ट्रिंग को Arduino स्ट्रिंग में कनवर्ट करना है?

उत्तर

9

कई बातें:

  1. मैं कुछ Arduino से स्वतंत्र कर के अपने तर्कसंगत बारे में निश्चित नहीं हूँ। आमतौर पर, माइक्रोकंट्रोलर प्रोग्रामिंग कुछ बहुत ही मॉड्यूलबल नहीं होता है और यह शास्त्रीय कंप्यूटर प्रोग्राम से बहुत अलग हो सकता है। यदि आप वास्तव में किसी भी माइक्रोकंट्रोलर और किसी भी प्लेटफ़ॉर्म से स्वतंत्र होना चाहते हैं, तो आप अभी भी सी-स्टाइल स्ट्रिंग का उपयोग कर सकते हैं, char * वर्णों की सरणी को इंगित करते हुए।
  2. जो करना आप करना चाहते हैं वह बिल्कुल आसान नहीं है। सबसे पहले आपको अपने std::string लाइब्रेरी के स्रोत कोड की आवश्यकता होगी। #include <string> करना पर्याप्त नहीं है: आपको AVR प्लेटफ़ॉर्म के लिए स्ट्रिंग लाइब्रेरी को संकलित करना होगा।
  3. क्लासिकल कंप्यूटर प्रोग्राम की तुलना में Arduino C++ कोड को संसाधित करने के तरीके में कुछ "सीमाएं" हैं: उदाहरण के लिए, ऑपरेटर new और delete लागू नहीं किए गए हैं। इसके अलावा, std::string कार्यान्वयन द्वारा अन्य चीजों की आवश्यकता हो सकती है, इसलिए प्रबंधन के लिए कई निर्भरताएं, या कोड स्रोत आकार Arduino के लिए बहुत बड़ा है।

Arduino तरह AVR माइक्रोकंट्रोलर के लिए शास्त्रीय स्ट्रिंग उपकरणों के कुछ कार्यान्वयन कर रहे हैं, लेकिन वे सी-शैली तार के लिए (एक वस्तु उन्मुख तरीके से और नहीं) एक प्रक्रियात्मक तरीके से किया जाता है। उदाहरण के लिए, AVR-libc AVR-जीसीसी के साथ आने के लिए, आप कार्यों की सूची देख सकते हैं: avr-libc string.h तुम भी है अच्छे पुराने printf: avr-libc stdio.h

यह उन्हें Arduino के साथ उपयोग करने के लिए यदि आप जोड़ने के लिए संभव है अपने कोड में अच्छी हेडर फाइलें, लेकिन अपने कोड के आकार से सावधान रहें! बस printf का उपयोग करके कई किलोबाइट्स आकार बढ़ा सकते हैं, जो आपकी आवश्यकताओं के आधार पर माइक्रोकंट्रोलर के लिए बहुत बड़ा हो सकता है।

निष्कर्ष करने के लिए, मेरे मन में, केवल पोर्टेबल तरह से एक char * स्ट्रिंग, http://arduino.cc/en/Reference/String

+0

धन्यवाद का उपयोग करने के लिए होगा। मैं char * का उपयोग करने की कोशिश करूंगा, क्योंकि मुझे बहुत सारे तारों की आवश्यकता नहीं है। – Tautvydas

+1

कोई 'नया' या 'हटाएं' ऑपरेटरों के बिना सी ++ को कैसे कार्यान्वित कर सकता है? क्या यह सब कुछ के बारे में नहीं तोड़ देगा? – anthropomorphic

+4

सी ++ के साथ, ढेर का उपयोग न करने पर, स्वचालित संग्रहण के साथ स्टैक पर ऑब्जेक्ट्स बनाना संभव है। ऑब्जेक्ट्स बनाते समय आप पॉइंटर्स और "नया" का उपयोग नहीं करते हैं। ऑब्जेक्ट तब स्कोप के अंत में स्वचालित रूप से हटाया जाता है, जैसे शास्त्रीय आदिम। Arduino के साथ, यही कारण है कि वस्तुओं को वैश्विक दायरे में किसी भी कार्य के बाहर आम तौर पर बनाया जाता है, और उसके बाद सेटअप() फ़ंक्शन के अंदर intialized (कन्स्ट्रक्टर में थोड़ा किया जाता है, एक init() जैसे फ़ंक्शन पसंद किया जाता है)। फिर लूप() में किसी भी सूचक संदर्भ को पारित किए बिना लूप() फ़ंक्शन में उनका उपयोग किया जा सकता है। –