কনট ইনট, এনাম বা # ডেফাইন যখন আরও বেশি কিছু বোঝায় তখন পিনের জন্য কেন একটি ইন্ট ভেরিয়েবল ব্যবহার করবেন


24

কোড প্রয়োগের সময় জুড়ে পিন পরিবর্তনের সম্ভাবনা না থাকায় লোকেরা কেন পিন নম্বর নির্দিষ্ট করতে ভেরিয়েবল ব্যবহার করে?

অনেক সময় আমি intপিন সংজ্ঞায় ব্যবহৃত হয়ে দেখি ,

int led = 13;

যখন একটি ব্যবহার const int

const int led = 13;

বা enum, বা#define

#define LED 13

আরও অনেক কিছু বোঝায়।

এটি এমনকি আরডিনো সাইটের টিউটোরিয়ালগুলিতেও রয়েছে, উদাহরণস্বরূপ, বেশিরভাগ লোকেরা চালিত প্রথম টিউটোরিয়াল, ব্লিঙ্ক

আমি কোথাও পড়া যে const intওভার পছন্দ করা হয় #define। শুরু থেকেই মানুষকে খারাপ অভ্যাস গড়ে তোলার পরিবর্তে কেন শুরু থেকেই এই উত্সাহ দেওয়া হচ্ছে না? আমি কিছুক্ষণ আগে এটি লক্ষ্য করেছি, তবে সম্প্রতি এটি আমাকে বিরক্ত করতে শুরু করেছে, তাই প্রশ্ন।

মেমোরি / প্রসেসিং / কম্পিউটিং ওয়াইজ হ'ল একটি const int, enumবা সেই বিষয়ে #defineসমভূমির চেয়ে ভাল int, অর্থাত্ কম স্মৃতি ধারণ করে, বিভিন্ন স্মৃতিতে সঞ্চিত (ফ্ল্যাশ, ইপ্রোম, এসআরএএম), দ্রুত এক্সিকিউশন, সংকলন তত দ্রুত?


এটির একটি সদৃশ বলে মনে হতে পারে # ধ্রুবকগুলির জন্য # ডেফাইন বা কনট ইন্ট ব্যবহার করা আরও ভাল? , তবে আমি কেন লোকেরা ভেরিয়েবল ব্যবহার করি এবং কোন ধরণের ধ্রুবকটি ভাল না তার চেয়ে পারফরম্যান্স কীভাবে উন্নত হয় সে প্রশ্নে আমি সম্বোধন করছি।


9
কারণ ভয়ানক ভয়ঙ্কর বীজ বয়ে যায়। বেশিরভাগ শখের লোকেরা পাকা প্রোগ্রামার না হয়ে অন্য শখকারীদের খারাপ অভ্যাসটি শিখায়।
ইগনাসিও ওয়াজকেজ-আব্রামস

উত্তর:


20
const int led = 13;

এটি সঠিক পদ্ধতি। অথবা এমনকি:

const byte led = 13;

আপনার কত পিন আছে?

কিছু টিউটোরিয়াল তাদের কাছে থাকা মানের গুণমানের পক্ষে যথেষ্টভাবে যায় নি।

পারফরম্যান্স আরও ভাল ব্যবহার করা হবে const byte, তুলনা করুন intতবে সংকলক আপনি কী করছেন তা উপলব্ধি করতে যথেষ্ট স্মার্ট হতে পারে।

আপনি যা করতে পারেন তা হ'ল লোককে নিজের কোডে ব্যবহার করে আরও দক্ষ কৌশল ব্যবহার করতে উত্সাহিত করা।


মন্তব্যে প্রতিক্রিয়া

  1. একজন মন্তব্যকারী পরামর্শ দিয়েছেন যে byteএটি স্ট্যান্ডার্ড সি নয় এটি সঠিক, তবে এটি একটি আরডুইনো স্ট্যাকএক্সচেঞ্জ সাইট এবং আমি বিশ্বাস করি যে আরডুইনো আইডিই সরবরাহিত স্ট্যান্ডার্ড প্রকারগুলি গ্রহণযোগ্য is

    আরডুইনো.হ এই লাইন আছে:

    typedef uint8_t byte;

    মনে রাখবেন যে এটি ঠিক একই রকম নয় unsigned char। দেখুন বনাম স্বাক্ষরবিহীন গৃহস্থালির কাজ uint8_t এবং যখন uint8_t ≠ স্বাক্ষরবিহীন গৃহস্থালির কাজ হয়?

  2. অন্য একজন মন্তব্যকারী পরামর্শ দিয়েছেন যে বাইট ব্যবহার করা অগত্যা কর্মক্ষমতা উন্নত করতে পারে না, কারণ এর চেয়ে কম সংখ্যায় intপ্রচার করা হবে int(আপনি যদি আরও কিছু চান তবে পূর্ণসংখ্যা প্রচারের নিয়মগুলি দেখুন)।

    তবে কোনও কনট সনাক্তকারী হিসাবে প্রসঙ্গে, সংকলকটি যে কোনও ক্ষেত্রে দক্ষ কোড তৈরি করবে। উদাহরণস্বরূপ, "জ্বলজ্বলে" বিচ্ছিন্ন করা এটিকে মূল আকারে দেয়:

    00000086 <loop>:
      86:   8d e0           ldi r24, 0x0D   ; 13
      88:   61 e0           ldi r22, 0x01   ; 1
      8a:   1b d1           rcall   .+566       ; 0x2c2 <digitalWrite>

    আসলে এটি একই কোড উত্পন্ন করে কিনা 13:

    • আক্ষরিক
    • ইহা একটি #define
    • ইহা একটি const int
    • ইহা একটি const byte

সংকলকটি জানে যে এটি কখন একটি রেজিস্টারে কোনও সংখ্যাকে ফিট করতে পারে এবং কখন তা করতে পারে না। তবে কোডিং ব্যবহার করা ভাল অভ্যাস যা আপনার অভিপ্রায় নির্দেশ করে । এটি তৈরি করলে constএটি স্পষ্ট হয় যে সংখ্যাটি পরিবর্তন হবে না এবং এটি byte(বা uint8_t) তৈরি করলে তা স্পষ্ট হয় যে আপনি অল্প সংখ্যক আশা করছেন।


বিভ্রান্তিকর ত্রুটি বার্তা

এড়াতে যাওয়ার আরও একটি বড় কারণ #defineহ'ল আপনি যদি কোনও ভুল করেন তবে প্রাপ্ত ত্রুটি বার্তাগুলি। এই "পলক" স্কেচটি বিবেচনা করুন যার একটি ত্রুটি রয়েছে:

#define LED = 13;

void setup() {
  pinMode(LED, OUTPUT);      // <---- line with error
}

void loop() {
  digitalWrite(LED, HIGH);   // <---- line with error 
  delay(1000);             
  digitalWrite(LED, LOW);    // <---- line with error
  delay(1000);              
}

উপরিভাগে এটি দেখতে ঠিক আছে তবে এটি ত্রুটি বার্তা উত্পন্ন করে:

Blink.ino: In function ‘void setup()’:
Blink:4: error: expected primary-expression before ‘=’ token
Blink:4: error: expected primary-expression before ‘,’ token
Blink:4: error: expected `;' before ‘)’ token
Blink.ino: In function ‘void loop()’:
Blink:8: error: expected primary-expression before ‘=’ token
Blink:8: error: expected primary-expression before ‘,’ token
Blink:8: error: expected `;' before ‘)’ token
Blink:10: error: expected primary-expression before ‘=’ token
Blink:10: error: expected primary-expression before ‘,’ token
Blink:10: error: expected `;' before ‘)’ token

আপনি প্রথম হাইলাইট করা রেখা (লাইন 4) দেখুন এবং একটি "=" চিহ্নও দেখতে পাবেন না । এছাড়াও, লাইনটি ভাল দেখাচ্ছে। এখন এটা মোটামুটি সুস্পষ্ট কি সমস্যা এখানে ( = 13প্রতিস্থাপিত হচ্ছে LED), কিন্তু যখন লাইন 400 লাইন আরও কোডে ডাউন তার সাথে পথে চালিত সংজ্ঞায়িত করা হয় সমস্যা সুস্পষ্ট নয়।

আমি এর জন্য বহুবার লোককে পড়ে থাকতে দেখেছি (নিজেকে সহ)।


আপনার কত পিন আছে? নিক একটি খুব ভাল পয়েন্ট, যেমন বেশিরভাগ বোর্ডের দশকের পরিসীমা থাকে, শত নয় (অর্থাৎ 255 এর চেয়ে বেশি), তাই intএকটিকে ওভারকিল করা হয় ... অর্থাৎ আর্দুইনো অবশেষে তেরা বোর্ডের সাথে বেরিয়ে আসা অবধি ... :-)
গ্রিননলাইন

2
সি এর কোন byteপ্রকার নেই । আপনি বলতে চাচ্ছেন unsigned char
কেভিন

পারফরম্যান্স অগত্যা byteপরিবর্তে এর চেয়ে ভাল হতে পারে না int, যেহেতু বেশিরভাগ প্রেক্ষাপটে, প্রকারের চেয়ে ছোট ধরণের সংখ্যার সাথে পূর্ণসংখ্যার মান intহয় int
পিট বেকার

1
C doesn't have a byte type. You mean unsigned char.- আমার উত্তর ছিল আরডুইনো প্রসঙ্গে, যা এটি রয়েছে typedef uint8_t byte;। সুতরাং একটি আরডুইনোর জন্য, ব্যবহার byteকরা ঠিক আছে।
নিক গ্যামন

Performance won't necessarily be better with byte instead of int- সংশোধিত পোস্ট দেখুন।
নিক গ্যামন

19

যেমন ইগনাসিও ঠিক বলেছেন, এটি মূলত কারণ তারা আরও ভাল জানেন না। এবং তারা আরও ভাল জানেন না কারণ যে লোকেরা তাদের শিখিয়েছিল (বা শেখার সময় তারা যে সংস্থানগুলি ব্যবহার করেছিল) তারা আরও ভাল জানত না।

বেশিরভাগ আরডুইনো কোড এবং টিউটোরিয়ালগুলি এমন লোকেরা লিখেছেন যাঁরা প্রোগ্রামিংয়ের কোনও প্রশিক্ষণ নেন নি এবং যারা প্রোগ্রামিংয়ের কোনও যথাযথ প্রশিক্ষণ ছাড়াই নিজেরাই খুব বেশি স্ব-শিক্ষিত মানুষ তাদের সংস্থান থেকে খুব বেশি "স্ব-শিক্ষিত" হন।

টিউটোরিয়াল কোডের স্নিপেটগুলি আমি প্রায় সেই জায়গার চারপাশে দেখতে পাই (এবং বিশেষত যারা কেবলমাত্র ইউটিউব ভিডিওতে পাওয়া যায় --- urgh) যদি আমি সেগুলিকে পরীক্ষায় চিহ্নিত করি তবে এটি ব্যর্থ চিহ্ন হতে পারে।

হ্যাঁ, একটি constনন-কনস্ট্যান্টের চেয়ে বেশি পছন্দ করা হয়, এমনকি একটিরও বেশি #define, কারণ:

  • const(যেমন #define, অ-কনস্টোন্টের বিপরীতে) কোনও র‌্যাম বরাদ্দ করে না
  • const(একটি কনস্ট্যান্টের মতো নয়, তবে এর বিপরীতে #define) মানটি একটি স্পষ্ট প্রকার দেয়

দ্বিতীয় পয়েন্টটি সেখানে বিশেষ আগ্রহী। যদি না বিশেষভাবে এমবেডেড ছাপার হরফ ঢালাইয়ের কাজ (সঙ্গে অন্যথায় বলেন (long)3) অথবা একটি টাইপ প্রত্যয় ( 3L) বা একটি দশমিক বিন্দু (উপস্থিতিতে 3.0), একটি #defineএকটি সংখ্যা সবসময় একটি পূর্ণসংখ্যা হতে পারে এবং যেমন যদি এটা একটি ছিল সব গণিত যে মান সম্পাদিত হবে পূর্ণসংখ্যা। বেশিরভাগ সময় এটি কোনও সমস্যা নয় তবে আপনি যখন #defineপূর্ণসংখ্যা সংরক্ষণ করতে পারেন তার চেয়ে বড় যে কোনও মানটির চেষ্টা করেন #define COUNT 70000এবং তারপরে intএটিতে অন্যান্য মান সহ একটি গাণিতিক ক্রিয়াকলাপ সম্পাদন করেন আপনি আকর্ষণীয় পরিস্থিতিগুলিতে চলে যেতে পারেন। একটি ব্যবহার করে constআপনি সংকলকটি বলতে পারবেন "এই মানটি এই পরিবর্তনশীল ধরণের হিসাবে বিবেচনা করা উচিত" - সুতরাং আপনি পরিবর্তে ব্যবহার করবেন: const long count = 70000;এবং সমস্ত প্রত্যাশা অনুযায়ী কাজ করবে।

এটির নক-অন-এফেক্টটিও রয়েছে যে জায়গাটির চারপাশের মানটি পাস করার সময় এটি টাইপটি পরীক্ষা করে। const longএমন কোনও ফাংশনটিতে পাস করার চেষ্টা করুন যা একটি প্রত্যাশা করে intএবং এটি ভেরিয়েবলের পরিসরকে সংকীর্ণ করা সম্পর্কে অভিযোগ করবে (বা এমনকি দৃশ্যের উপর নির্ভর করে সংকলন করতে পুরোপুরি ব্যর্থ হয়েছে)। এটি দিয়ে #defineএটি করুন এবং এটি নিঃশব্দে আপনাকে ভুল ফলাফল প্রদান করা চালিয়ে যাবে এবং কয়েক ঘন্টা আপনার মাথা আঁচড়ান।


7
এটি উল্লেখযোগ্য যে কোনও constভেরিয়েবলের জন্য প্রসঙ্গের উপর নির্ভর করে র‌্যামের প্রয়োজন হতে পারে , উদাহরণস্বরূপ, যদি এটি কোনও নন-কনস্টেক্সার ফাংশন থেকে রিটার্ন মান ব্যবহার করে আরম্ভ করা হয়।
পিটার ব্লুমফিল্ড

একইভাবে, const int foo = 13; bar(&foo);প্রকৃত মেমরির জন্য বরাদ্দ করার জন্য অবশ্যই সংকলকটির প্রয়োজন হবে foo
ইলমারি করোনেন

3
আপনি যদি কোনও ম্যাক্রো সংজ্ঞায়িত করেন যা কোনও সংকলকটিতে মানায় না এমন মানে প্রসারিত হয় যা মানটি intসবচেয়ে ছোট আকারের হিসাবে মানায় তবে এটি মানানসই হবে (স্বাক্ষরিত বনাম সম্পর্কিত স্বাক্ষরিত বিধি সম্পর্কে স্বাক্ষরিত নয়)। আপনি যদি একটি সিস্টেম যেখানে করছেন, তাহলে int16 বিট, #define count 70000পরিণাম ডেকে আনবে countএকটি মত খুঁজছি long, শুধু হিসাবে যদি এটি হিসাবে সংজ্ঞায়িত করা হয়েছে const long count = 70000;। তদুপরি, আপনি যদি সেই সংস্করণগুলির মধ্যে দুটি countপ্রত্যাশিত intকোনও ফাংশনে পাস করেন তবে কোনও বুদ্ধিমান সংকলক তাদের সাথে একই আচরণ করবে।
পিট বেকার

1
আমি @ পেটবেকারের সাথে একমত - এর মতো একটি নির্মাণ #define COUNT 70000কোনও ইনটকে ছাঁটাই করে না, তবে সংকলকটি এ সংখ্যাটি ধরে রাখার জন্য এটি যথেষ্ট বড় আকারের হিসাবে বিবেচনা করে। এটি সত্য যে আপনি যখন COUNTএটি ব্যবহার করেন যে এটি কোনও অন্তর্নিহিত নয়, তবে এটি স্পষ্ট নাও হতে পারে তবে const longযেভাবেই আপনি একই জিনিস বলতে পারেন ।
নিক গ্যামন

2
"একটি # নির্ধারণ সর্বদা একটি পূর্ণসংখ্যার হবে" এটি সত্য নয়। আপনি পূর্ণসংখ্যার আক্ষরিক নিয়মগুলি নিচ্ছেন এবং সেগুলি প্রিপ্রোসেসর ম্যাক্রোগুলিতে প্রয়োগ করছেন। এটি আপেল এবং পপ সংগীতের তুলনা করার মতো। অভিব্যক্তি COUNTআপনার উদাহরণে অভিব্যক্তি সঙ্গে সংকলন আগে প্রতিস্থাপিত হয় 70000, যা একটি টাইপ লিটারেল নিয়ম দ্বারা সংজ্ঞায়িত হয়েছে, ঠিক 2বা 13Lবা 4.0লিটারেল এর বিধি দ্বারা সংজ্ঞায়িত করা হয়। আপনি যে #defineঅভিব্যক্তিগুলির উপন্যাসটি ব্যবহার করেন তা অপ্রাসঙ্গিক। আপনি চাইলে #defineসি কোডের স্বেচ্ছাসেবক খণ্ডগুলি ব্যবহার করতে পারেন।
মনিকার সাথে হালকাতা রেস

2

আরডুইনোর কাছে 2 সপ্তাহের নবাগত হিসাবে আমি আরডুইনোকে নন-প্রোগ্রামারদের দখলে রাখার সাধারণ ধারণাটি গ্রহণ করব। আমি পরীক্ষা করেছি বেশিরভাগ স্কেচগুলি, আরডুইনো সাইটের অন্তর্ভুক্তগুলি সহ, পুরোপুরি অর্ডারের অভাব প্রদর্শন করে, এমন স্কেচগুলি যা কাজ করে না এবং সবেমাত্র একটি সুসংগত মন্তব্য দৃষ্টিতে দেখায়। ফ্লো চার্টগুলি অস্তিত্বহীন এবং "গ্রন্থাগারগুলি" একটি অ-মধ্যপন্থী বিশৃঙ্খলা।


0

আমার উত্তরটি ... তারা কাজ করে কারণ এটি কার্যকর হয়। আমার উত্তরে কোনও প্রশ্ন জিজ্ঞাসা করতে আমার বেশ কষ্ট হচ্ছে, "কেন এটি 'ভুল' হতে হবে?"


3
একটি ভাল প্রোগ্রামারের একটি হলমার্কটি হ'ল কোডটি সর্বদা তাদের উদ্দেশ্যগুলি প্রতিবিম্বিত করে।
Ignacio Vazquez-Abram

1
আমরা এখনও আরডুইনোসের কথা বলছি, তাই না? ;)
linhartr22

3
আরডুইনো ইতিমধ্যে বৃহত্তর EE সম্প্রদায়ের খারাপ প্রতিক্রিয়া করেছে কারণ সম্প্রদায়টি মধ্যম থেকে ভয়ঙ্কর হার্ডওয়্যার ডিজাইন রেখেছে। আমরা কি কিছু সম্পর্কে একটি sh * টি দেওয়ার চেষ্টা করা উচিত নয় ?
Ignacio Vazquez-Abram

2
"বেশিরভাগ প্রকল্পের জীবন বা আর্থিক ঝুঁকির সাথে জড়িত হয় না ..." সেখানে অবাক হওয়ার কিছু নেই। কারা আড়ডিনোকে জড়িত করতে চায় যেখানে সম্প্রদায়টি দেখার পরে ঝুঁকির কোনও সম্ভাবনা নেই।
Ignacio Vazquez-Abram

2
এটি 'ভুল' নয় কারণ এটি একটি নির্দিষ্ট পরিস্থিতিতে কাজ করে না তবে কারণ এটি 'ডান' করার তুলনায় আরও অনেক পরিস্থিতি রয়েছে যেখানে এটি কাজ করে না । এটি কোডকে ভঙ্গুর করে তোলে; কোডে পরিবর্তনগুলি রহস্যজনক ব্যর্থতা তৈরি করতে পারে যা ডিবাগিংয়ের সময় খায়। সংকলকটির প্রকারের পরীক্ষা করা এবং ত্রুটি বার্তাগুলি আপনাকে সেই ধরণের ত্রুটিগুলি আগের চেয়ে বেশি আগে ধরাতে সহায়তা করতে পারে।
কর্ট জে সাম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.