I / O पिन को परिभाषित करने का सबसे अच्छा तरीका क्या है?


9

मैंने जैसे परिभाषाएँ पढ़ीं

const int ledPin = 9;

और भी

#define ledPin 9

मुझे पता है कि एक परिभाषा की तरह

int ledPin = 9;

एक बुरा अभ्यास है अगर आप इसे बदलने नहीं जा रहे हैं (जो आप आमतौर पर नहीं करेंगे), हालांकि मैंने इसे कई बार Arduino कार्यक्रमों में देखा है। अन्य दो में से किसे पसंद किया जाता है?

जवाबों:


6

#define ledPin 9पसंद है। ऐसा करने से int ledPin = 9;आपको एक intमेमोरी आवंटित की जाएगी जिसका मूल्य आपके द्वारा उपयोग किए जाने पर हर बार उपयोग किया जाता है ledPin#defineइस अर्थ में अलग है कि यह स्मृति आवंटित नहीं करता है। कोई मेमोरी नहीं है ledPin। कोड में सभी "ledPin" को संकलित करने से पहले (तार के अलावा) को बदल दिया जाता है 9। तो मूल रूप से

digitalWrite(ledPin);

हो जाता है

digitalWrite(9);

के लाभ #define: स्मृति बचाता है और चूंकि सभी निष्पादनledPin से 9 पहले बदल दिए जाते हैं , यह प्रोसेसर समय बचाता है।

वास्तव में छोटे कोड में कोई फर्क नहीं पड़ता ...


क्या एम्बेडेड कंपाइलर्स वास्तव में इतने खराब हैं कि वे उपयोग करते समय निरंतर तह नहीं करते हैं const int?
चूू

1
@चू जहां तक ​​मुझे पता है कि अरुडिनो एवीआर के लिए जीसीसी का उपयोग करता है। इसलिए इसे लगभग निश्चित रूप से अनुकूलित किया जाना चाहिए। यहाँ जवाब C ++ में अच्छे अभ्यास की ज्यादा समझ नहीं दिखाते हैं
chbaker0

3
C ++ में, const int ledPin = 9;2 अन्य विकल्पों पर पसंद किया जाता है। intयदि आप कहीं पर एक पॉइंटर को परिभाषित करते हैं, तो यह एक को छोड़कर कुछ के लिए मेमोरी आवंटित नहीं करेगा , जो कोई भी नहीं करेगा।
jfpoilpret

Const int मैमोरी @jfpoilpret आवंटित करता है। #define किसी भी मेमोरी को नहीं लेता है, जो अभिव्यक्ति का सिर्फ एक प्रतीकात्मक नाम है और स्मृति का नाम नहीं ...

इस लिंक को देखें cplusplus.com/forum/beginner/28089 और खुद देखें। अन्यथा केवल Arduino IDE के साथ चेक करें: डेटा आकार को कॉन्स्टेबल और #define के साथ देखें।
jfpoilpret

4

सख्ती से बोलना, #defineदृष्टिकोण थोड़ा कम मेमोरी का उपयोग करेगा। अंतर आमतौर पर हालांकि छोटा है। यदि आपको मेमोरी उपयोग को कम करने की आवश्यकता है, तो अन्य अनुकूलन शायद अधिक प्रभावी होंगे।

का उपयोग करने के पक्ष में कोई तर्क const intहै प्रकार सुरक्षा । जहाँ भी आप वेरिएबल द्वारा उस पिन नंबर का उल्लेख करते हैं, आप ठीक से जानते हैं कि आपको किस प्रकार का डेटा मिल रहा है। कोड का उपयोग करके इसे स्पष्ट रूप से या स्पष्ट रूप से प्रचारित / परिवर्तित किया जा सकता है, लेकिन इसे बहुत स्पष्ट तरीके से व्यवहार करना चाहिए।

इसके विपरीत, मूल्य में #defineव्याख्या के लिए खुला है। समय का विशाल बहुमत, यह शायद आपको किसी भी समस्या का कारण नहीं होगा। यदि आपके पास कोड है जो मूल्य के प्रकार या आकार के बारे में धारणा बनाता है तो आपको बस थोड़ा सावधान रहने की जरूरत है।

व्यक्तिगत रूप से, मैं लगभग हमेशा प्रकार की सुरक्षा पसंद करता हूं जब तक कि मुझे स्मृति को बचाने की बहुत गंभीर आवश्यकता न हो।


जब तक मैं पीटर का जवाब नहीं पढ़ता मैं #define कैंप में था। मुझे लगता है कि मुझे पता है कि इस सप्ताह के अंत में कोड को फिर से भरना होगा। ;)
linhartr22

2

संभवतः सबसे अच्छा तरीका होगा
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
या
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
नाम स्थिरांक में C ++ (और अन्य) में सामान्य अभ्यास के अनुसार कैप है। यह अपने आप में किसी भी रैम का उपयोग नहीं करना चाहिए, और प्रति उपयोग प्रोग्राम मेमोरी के 1 बाइट का उपयोग करना चाहिए।
हालाँकि, समस्या तब हो सकती है जब संख्या 127 से अधिक हो और बड़े हस्ताक्षर किए गए पूर्णांकों को प्रचारित करते समय साइन-विस्तारित हो (इस पर पूरी तरह से निश्चित नहीं), हालांकि यह पिन नंबर के साथ होने की संभावना नहीं है।


-1

होगा ही नहीं

const int ledPin = 9;

रैम लें, लेकिन इस मामले में, digitalWrite(uint8_t, uint8_t)आवश्यकता से अधिक रैम का उपयोग करेगा क्योंकि केवल एक-बाइट तर्क की आवश्यकता होती है, और एक आम तौर पर दो बाइट्स (कंपाइलर-निर्भर, लेकिन विशिष्ट) होते हैं। ध्यान दें कि आप शाब्दिक #define में एक स्पष्ट प्रकार दे सकते हैं:

#define ledPin ((int)9) 

हालांकि एक फ़ंक्शन तर्क जैसे एक संदर्भ में जहां एक विशिष्ट प्रकार की आवश्यकता होती है (क्योंकि फ़ंक्शन को ठीक से प्रोटोटाइप किया गया था!) ​​यह या तो अंतर्निहित रूप से डाली जाएगी या यदि कोई त्रुटि संदेश नहीं मिलता है तो टाइप करें।


@DrivebyDownvoter, क्या आप अपने कारणों पर टिप्पणी करेंगे?
JRobert
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.