আই / ও পিন সংজ্ঞায়নের সর্বোত্তম উপায় কী?


9

আমি যেমন সংজ্ঞা পড়ি

const int ledPin = 9;

এবং আরো

#define ledPin 9

আমি জানি যে একটি সংজ্ঞা

int ledPin = 9;

আপনি এটি পরিবর্তন করতে যাচ্ছেন না তবে এটি একটি খারাপ অনুশীলন (যা আপনি সাধারণত তা করেন না), যদিও আমি এটি আর্দুইনো প্রোগ্রামগুলিতে বেশ কয়েকবার দেখেছি। অন্য দুজনের মধ্যে কোনটি পছন্দ?

উত্তর:


6

#define ledPin 9পছন্দসই এটি করার মাধ্যমে int ledPin = 9;আপনি একটি intমেমরি বরাদ্দ করবেন যার মূল্য প্রতিটি সময় ব্যবহার করা হয় ledPin#defineএটি মেমরি বরাদ্দ দেয় না অর্থে পৃথক। কোন স্মৃতি বলা হয় না ledPin। কোডে সমস্ত "নেতৃত্বাধীন পিন" সংকলনের আগে (স্ট্রিং ব্যতীত) দ্বারা প্রতিস্থাপন করা হয় 9। তাই মূলত

digitalWrite(ledPin);

হয়ে

digitalWrite(9);

এর সুবিধাগুলি #define: স্মৃতি সংরক্ষণ করে এবং যেহেতু সবগুলি কার্যকর করার আগেledPin প্রতিস্থাপন করা হয় , এটি প্রসেসরের সময় সাশ্রয় করে।9

ছোট কোডগুলিতে আসলেই কিছু আসে যায় না ...


এম্বেড করা সংকলকগুলি কি এতই খারাপ যে তারা ব্যবহারের সময় ধ্রুবক ভাঁজ করে না const int?
চুউ

1
@ চিউ যতদূর আমি জানি আরডুইনো অ্যাভির জন্য জিসিসি ব্যবহার করে। সুতরাং এটি প্রায় অবশ্যই অপ্টিমাইজ করা উচিত। এখানে উত্তরগুলি C ++
chbaker0

3
সি ++ এ const int ledPin = 9;2 টি বিকল্পের চেয়ে বেশি পছন্দ করা হয়। intআপনি যদি এটির জন্য কোনও পয়েন্টারটি কোথাও সংজ্ঞায়িত করেন তবে এটি কোনওর জন্য মেমরির বরাদ্দ দেয় না which
jfpoil ব্যাখ্যা

কনস্ট ইন্টি মেমরির বরাদ্দ করে না #

এই লিঙ্কটি দেখুন cplusplus.com/forum/beginner/28089 এবং নিজের জন্য দেখুন। অন্যথায় কেবল আরডুইনো আইডিই দিয়ে চেকটি সম্পাদন করুন: কনস্টের সাথে এবং # ডিফাইন দিয়ে ডেটা আকার চেক করুন।
jfpoil ব্যাখ্যা 17

4

কঠোরভাবে বলতে গেলে, #defineপদ্ধতির সামান্য কম স্মৃতি ব্যবহার করা হবে। পার্থক্য যদিও সাধারণত ক্ষুদ্র। আপনার যদি মেমোরির ব্যবহার হ্রাস করতে হয়, তবে অন্যান্য অপটিমাইজেশন সম্ভবত আরও কার্যকর হবে।

ব্যবহারের পক্ষে একটি যুক্তি const intহ'ল টাইপ সুরক্ষা । ভেরিয়েবলের মাধ্যমে আপনি যেখানে এই পিন নম্বরটি উল্লেখ করেন, আপনি ঠিক কী জানেন যে আপনি কী ডেটা টাইপ করছেন। এটি প্রচারিত / রূপান্তরিত হতে পারে স্পষ্টভাবে বা স্পষ্টভাবে কোড দ্বারা এটি ব্যবহার করে, তবে এটি খুব পরিষ্কার উপায়ে আচরণ করা উচিত।

বিপরীতে, একটিতে মানটি #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 ledPin ((int)9) 

যদিও একটি প্রসঙ্গে যেমন একটি ফাংশন আর্গুমেন্ট যেখানে একটি নির্দিষ্ট প্রকারের প্রয়োজন হয় (কারণ ফাংশনটি সঠিকভাবে প্রোটোটাইপড ছিল!) এটি হয় স্পষ্টতই নিক্ষেপ করা হবে বা প্রকারগুলি মেলে না তবে একটি ত্রুটি বার্তা পাবে।


@ ড্রাইভবিডাউনভোটার, আপনি কি আপনার কারণ সম্পর্কে মন্তব্য করবেন?
জোরবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.