সম্পাদনা: মাইক্রোথেরিয়ান একটি দুর্দান্ত উত্তর দেয় যা আমার কিছু পয়েন্ট এখানে সংশোধন করে বিশেষত মেমরির ব্যবহার সম্পর্কে।
যেমন আপনি চিহ্নিত করেছেন, এমন কয়েকটি পরিস্থিতি রয়েছে যেখানে আপনাকে একটি ব্যবহার করতে বাধ্য করা হয় #define
, কারণ সংকলক কোনও const
পরিবর্তনশীলকে অনুমতি দেয় না । একইভাবে, কিছু পরিস্থিতিতে আপনাকে ভেরিয়েবলগুলি ব্যবহার করতে বাধ্য করা হয়, যেমন আপনার যখন মূল্যগুলির অ্যারের প্রয়োজন হয় (যেমন আপনার কোনও অ্যারে থাকতে পারে না #define
)।
তবে আরও অনেক পরিস্থিতি রয়েছে যেখানে অগত্যা একটিও 'সঠিক' উত্তর নেই। এখানে কিছু গাইডলাইন রয়েছে যা আমি অনুসরণ করব:
প্রকারের সুরক্ষা
একটি সাধারণ প্রোগ্রামিং পয়েন্ট অফ ভিউ থেকে, const
ভেরিয়েবলগুলি সাধারণত পছন্দনীয় (যেখানে সম্ভব হয়)। এর মূল কারণ হ'ল টাইপ-সেফটি।
এ #define
(প্রিপ্রোসেসর ম্যাক্রো) কোডের প্রতিটি স্থানে আক্ষরিক মানটিকে সরাসরি অনুলিপি করে প্রতিটি ব্যবহারকে স্বাধীন করে তোলে। এটি হাইপোথিটিক্যালি ফলস্বরূপ তৈরি করতে পারে, কারণ এটি কীভাবে / কোথায় ব্যবহার করা হয়েছে তার উপর নির্ভর করে প্রকারটি ভিন্নভাবে সমাধান করা যেতে পারে।
একটি const
ভেরিয়েবল কেবল সর্বদা এক প্রকারের, যা এর ঘোষণার মাধ্যমে নির্ধারিত হয় এবং সূচনা করার সময় সমাধান করা হয় resolved এটি আলাদাভাবে আচরণ করার আগে প্রায়শই একটি স্পষ্ট কাস্টের প্রয়োজন হবে (যদিও বিভিন্ন পরিস্থিতি রয়েছে যেখানে এটি নিরাপদে স্পষ্টতই টাইপ-প্রচারিত হতে পারে)। খুব কমপক্ষে, সংকলকটি (যদি সঠিকভাবে কনফিগার করা থাকে) কোনও টাইপ সমস্যা দেখা দেয় তখন আরও নির্ভরযোগ্য সতর্কতা নির্গত করতে পারে।
এটির জন্য একটি সম্ভাব্য কর্মক্ষেত্র হ'ল একটি এর মধ্যে সুস্পষ্ট কাস্ট বা টাইপ-প্রত্যয় অন্তর্ভুক্ত করা #define
। উদাহরণ স্বরূপ:
#define THE_ANSWER (int8_t)42
#define NOT_QUITE_PI 3.14f
এই পদ্ধতিটি সম্ভবত এটির ব্যবহারের উপর নির্ভর করে কিছু ক্ষেত্রে সিনট্যাক্স সমস্যা সৃষ্টি করতে পারে।
স্মৃতি ব্যবহার
সাধারণ উদ্দেশ্য কম্পিউটিংয়ের মতো নয়, আরডুইনোর মতো কিছু নিয়ে কাজ করার সময় মেমরি স্পষ্টভাবে একটি প্রিমিয়ামে থাকে। const
ভেরিয়েবল বনাম একটি ব্যবহার #define
করে ডেটা মেমরিতে কোথায় সঞ্চয় করা হয় তা প্রভাবিত করতে পারে যা আপনাকে এক বা অন্যটি ব্যবহার করতে বাধ্য করতে পারে।
const
ভেরিয়েবলগুলি (সাধারণত) অন্যান্য সমস্ত ভেরিয়েবলের সাথে এসআরএমে সংরক্ষণ করা হবে।
- ব্যবহৃত আক্ষরিক মানগুলি
#define
প্রায়শই স্কেচের পাশাপাশি প্রোগ্রাম স্পেসে (ফ্ল্যাশ মেমরি) সংরক্ষণ করা হবে।
(দ্রষ্টব্য যে এখানে বিভিন্ন জিনিস রয়েছে যা কিছু কীভাবে এবং কোথায় সঞ্চিত হয় যেমন সংকলক কনফিগারেশন এবং অপ্টিমাইজেশানকে প্রভাবিত করতে পারে))
এসআরএএম এবং ফ্ল্যাশের বিভিন্ন সীমাবদ্ধতা রয়েছে (উদাহরণস্বরূপ ইউনোর জন্য 2 কেবি এবং 32 কেবি)। কিছু অ্যাপ্লিকেশনগুলির জন্য, এসআরএএম এর বাইরে চলে যাওয়া বেশ সহজ, তাই কিছু জিনিস ফ্ল্যাশে স্থানান্তরিত করা সহায়ক হতে পারে। বিপরীতটিও সম্ভব, যদিও সম্ভবত কম সাধারণ।
PROGMEM
এটা সম্ভব টাইপ-নিরাপত্তা সুবিধা পেতে পাশাপাশি কর্মসূচি স্থান (ফ্ল্যাশ) এ ডেটা সঞ্চয় করার। এটি PROGMEM
কীওয়ার্ড ব্যবহার করে সম্পন্ন হয়েছে । এটি সব ধরণের জন্য কাজ করে না, তবে এটি সাধারণত পূর্ণসংখ্যা বা স্ট্রিংয়ের অ্যারেগুলির জন্য ব্যবহৃত হয়।
ডকুমেন্টেশনে প্রদত্ত সাধারণ ফর্মটি নিম্নরূপ:
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
স্ট্রিং টেবিলগুলি কিছুটা জটিল, তবে ডকুমেন্টেশনের পুরো বিশদ রয়েছে।