কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রামে স্টোরেজ ক্লাস (Storage Classes)


ভেরিয়েবল এবং ডেটা টাইপ নিয়ে আলোচনা করা হয়েছে। এখন আমরা দেখব কিভাবে ভেরিয়েবলগুলকে এর স্কোপ এবং ভিজিবিলিটির অনুযায়ী শ্রেণিবদ্ধ করা যায়।

স্কোপ (Scope)

সাধারণত, স্কোপ হলো একটি টার্ম যা একটি ভেরিয়েবলের লাইফটাইমকে নির্দেশ করে। এটি কতক্ষণ কাজ করবে এবং কখন ধ্বংস হবে।

ভিজিবিলিটি (Visibility)

ভিজিবিলিটি দেখায় ভেরিয়েবলটি কোথা থেকে দৃশ্যমান, অর্থাৎ কোথা থেকে ভেরিয়েবলটি ব্যবহার করা যায়। উদাহরণস্বরূপ, যদি আমরা লোকাল ভেরিয়েবল ব্যবহার করি, তবে আমরা এটিকে অন্য ফাংশন বা ফাইল থেকে ব্যবহার করতে পারি না, তাই এটি শুধু ব্লকের ভিতরে দৃশ্যমান।

ব্লক (Block)

ব্লক বলতে দুটি কার্লি ব্রেস {…} এর মাঝপথে থাকা লাইনের সেটকে বোঝায়। উদাহরণ:

{
    //line1
    //line2
    //line3
}

স্টোরেজ ক্লাস টেবিল

Storage Class কীভাবে ঘোষণা Scope Visibility
autoGlobally

autoLocallyBlockBlock
registerGlobally

registerLocallyBlockBlock
staticGloballyProgramFile
staticLocallyProgramBlock
externGloballyProgramProgram
externLocallyProgramBlock

স্টোরেজ ক্লাসের বেসিক সিনট্যাক্স

<storage class> <datatype> variable_name;
উদাহরণ: static int my_var = 0;

দ্রষ্টব্য: যদি আমরা <datatype> variable_name; লিখি কোনো স্টোরেজ ক্লাস নির্দিষ্ট না করে, তবে এটি স্বয়ংক্রিয়ভাবে 'auto' স্টোরেজ ক্লাস হবে।

Auto স্টোরেজ ক্লাস

Auto স্টোরেজ ক্লাস হলো সব লোকাল ভেরিয়েবলের ডিফল্ট স্টোরেজ ক্লাস।

{
    int mount;
    auto int month;
}

উপরের উদাহরণে দুটি ভেরিয়েবল একই স্টোরেজ ক্লাসে সংজ্ঞায়িত হয়েছে। 'auto' শুধু ফাংশনের ভিতরে ব্যবহার করা যায়, অর্থাৎ লোকাল ভেরিয়েবল।

Register স্টোরেজ ক্লাস

Register স্টোরেজ ক্লাস aquell লোকাল ভেরিয়েবল সংজ্ঞায়িত করতে ব্যবহৃত হয় যা র‍্যাম (RAM)-এর বদলে রেজিস্টারে সংরক্ষিত হওয়া উচিত। এর মানে ভেরিয়েবলটির সর্বোচ্চ আকার রেজিস্টারের আকারের সমান (সাধারণত একটি ওয়ার্ড) এবং এর ওপর আনয়ারি '&' অপারেটর প্রয়োগ করা যায় না (কারণ এর কোনো মেমরি লোকেশন নেই)।

{
    register int miles;
}

Register শুধু সেই ভেরিয়েবলগুলোর জন্য ব্যবহার করা উচিত যাদের দ্রুত অ্যাক্সেস দরকার (যেমন কাউন্টার)। এছাড়াও মনে রাখতে হবে যে 'register' সংজ্ঞায়িত করলে ভেরিয়েবলটি রেজিস্টারে সংরক্ষিত হবে তা নিশ্চিত হয় না। এর মানে হলো হার্ডওয়্যার এবং ইমপ্লিমেন্টেশন সীমাবদ্ধতার ওপর নির্ভর করে এটি রেজিস্টারে সংরক্ষিত হতে পারে।

Static স্টোরেজ ক্লাস

static স্টোরেজ ক্লাস কম্পাইলারকে নির্দেশ দেয় একটি লোকাল ভেরিয়েবলকে প্রোগ্রামের লাইফটাইম পর্যন্ত অস্তিত্বে রাখতে, প্রতিবার স্কোপে আসা এবং যাওয়ার সময় তৈরি এবং ধ্বংস করার বদলে। তাই, লোকাল ভেরিয়েবলকে static করলে সেগুলো ফাংশন কলের মাঝপথে তাদের মান বজায় রাখতে পারে।

Static মডিফায়ার গ্লোবাল ভেরিয়েবলেও প্রয়োগ করা যেতে পারে। এটি করলে সেই ভেরিয়েবলটির স্কোপ সেই ফাইলে সীমাবদ্ধ হয়ে যায় যেখানে এটি ঘোষণা করা হয়েছে।

সি প্রোগ্রামিং-এ, যখন static একটি গ্লোবাল ভেরিয়েবলে ব্যবহার করা হয়, তবে এটি কেবল একটি কপি সে ক্লাসের সব অবজেক্টের মধ্যে শেয়ার করা হয়।

উদাহরণ কোড

#include <stdio.h>

/* ফাংশন ঘোষণা */
void func(void);

static int count = 5; /* গ্লোবাল ভেরিয়েবল */

main() {
    while(count--) {
        func();
    }
    return 0;
}

/* ফাংশন সংজ্ঞায়ন */
void func(void) {
    static int i = 5; /* লোকাল স্ট্যাটিক ভেরিয়েবল */
    i++;
    printf("i is %d and count is %d\n", i, count);
}

আউটপুট

i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0

Extern স্টোরেজ ক্লাস

extern স্টোরেজ ক্লাস একটি গ্লোবাল ভেরিয়েবলের রেফারেন্স দেওয়ার জন্য ব্যবহৃত হয় যা সব প্রোগ্রাম ফাইলে দৃশ্যমান। যখন আপনি 'extern' ব্যবহার করেন, তখন ভেরিয়েবলটি ইনিশিয়ালাইজ করা যায় না, তবে এটি ভেরিয়েবল নামকে একটি স্টোরেজ লোকেশনে নির্দেশ করে যা পূর্বে সংজ্ঞায়িত হয়েছে।

যদি আপনার একাধিক ফাইল থাকে এবং আপনি একটি গ্লোবাল ভেরিয়েবল বা ফাংশন সংজ্ঞায়িত করেন, যেটি অন্য ফাইলগুলোর জন্যও ব্যবহার করা হবে, তবে extern অন্য ফাইলে সংজ্ঞায়িত ভেরিয়েবল বা ফাংশনের রেফারেন্স দেওয়ার জন্য ব্যবহার করা হয়। বোঝার সুবিধার্থে, extern অন্য একটি ফাইলে গ্লোবাল ভেরিয়েবল বা ফাংশন ঘোষণা করতে ব্যবহৃত হয়।

extern মডিফায়ার সবচেয়ে বেশি তখন ব্যবহার করা হয় যখন দুটি বা তার অধিক ফাইল একই গ্লোবাল ভেরিয়েবল বা ফাংশন শেয়ার করে।

উদাহরণ কোড (main.c):

#include <stdio.h>
int count;
extern void write_extern();

main() {
    count = 5;
    write_extern();
}

উদাহরণ কোড (support.c):

#include <stdio.h>
extern int count;

void write_extern(void) {
    printf("count is %d\n", count);
}

আউটপুট

count is 5
  1. C#-এ নেস্টেড ক্লাস (Nested Classes)

  2. C#-এ অ্যাবস্ট্র্যাক্ট ক্লাস

  3. মাল্টি-ইনহেরিটেন্স পাইথন ক্লাসে ক্লাস ভেরিয়েবল কীভাবে কাজ করে?

  4. প্রোগ্রামিং-এ ক্লাসের গুরুত্ব: কোড সংগঠন এবং অ্যাবস্ট্রাকশন বাড়ানো