প্রত্যেকটা ফাংশনকেই ডিক্লেয়ার করার সময় (prototype লিখা বা একেবারে ডিফাইন করার সময়) তার একটা রিটার্ন টাইপ ডিক্লেয়ার করতে হয়। আর রিটার্ন দেওয়ার জন্য return কি ওয়র্ডটি ব্যবহার করা হয়। এটি ব্যবহারের সাধারণ নিয়ম হচ্ছে,
return value;
এখানে value এর স্থানে রিটার্ন টাইপের সাথে মিলে যায় এমন যে কোন ডেটা সরাসরি থাকতে পারে, সেই ধরণের ডেটা বহন করে এমন ভ্যারিয়েবল থাকতে পারে, অথবা এমন কোন এক্সপ্রেশন থাকতে পারে যার চুড়ান্ত মান ঐ ডেটা টাইপের কোন ডেটা।
কাজেই যে ফাংশনের রিটার্ন টাইপ int, তার ক্ষেত্রে আমরা
return 5; লিখতে পারি, আবার
int x=5;
return x; লিখতে পারি, আবার
return 3+2;
অথবা
int a=3, b=2;
return a+b; আকারেও লিখতে পারি।
return কেবলমাত্র ফাংশনের রিটার্ন ভ্যালুর জন্য এবং ফাংশনের সমাপ্তি নির্দেশ করার জন্য ব্যবহৃত হয়।
এই রিটার্ন টাইপটা কি? রিটার্ন জিনিসটাই বা কি??
একটা ফাংশনকে কল করার উদ্দেশ্য হচ্ছে তাকে দিয়ে কোন কাজ করিয়ে নেওয়া। শুধু শুধু কোন ফাংশনকে কল করা হয় না। আগেও বলা হয়েছে, একটি C প্রোগ্রাম হচ্ছে অনেকগুলো ফাংশন কলের একটি সিরিজ। এখানে একটি ফাংশন অন্য কোন এক বা একাধিক ফাংশনকে কল করে থাকে প্রয়োজনমত বিভিন্ন কাজ করিয়ে নেবার জন্য।
কাজেই কোন ফাংশনকে কল করা হলে,
১. যে কাজটি করার জন্য তাকে ডাকা হয়েছিলো সেই কাজটি সে করে দিবে,
২. কাজটি সে সফলভাবে করতে পেরেছে কি না সেই সম্পর্কে কলিং ফাংশনকে তথ্য দিবে।
যদি এমন কোন কাজ করার জন্য কোন ফাংশনকে ডাকা হয়, যেখানে চুড়ান্ত ফলাফল একটি ভ্যালু বা ডেটা, তাহলে সেই ফাংশন তার কলিং ফাংশনকে সেই ভ্যালুটি কাজ শেষে রিটার্ন হিসেবে দেয়। এই ভ্যালু যে কোন ডেটা টাইপের হতে পারে। যেমন, ইন্টিজার, ফ্লোটিং পয়েন্ট, এরে পয়েন্টার, স্ট্রিং পয়েন্টার, স্ট্রাকচার, অন্য আরেকটি ফাংশন ইত্যাদি।
উদাহরণস্বরূপ, ২ টি স্ট্রিং কে তুলনা করার ফাংশন strcmp() এর কথা ধরা যাক। এই ফাংশনের কাজ দুটি স্ট্রিংকে লেক্সিকোগ্রাফিক্যালি তুলনা করা। যদি দুইটি স্ট্রিংকে তুলনা করা হয়, তাহলে তিনটি ঘটনা ঘটতে পারে।
১. প্রথম স্ট্রিংটি বড়, ২য় টি ছোট
২. ২য় স্ট্রিংটি বড়, ১ম টি ছোট
৩. দুটি স্ট্রিং সমান।
strcmp() ফাংশনের কাজ হচ্ছে তুলনার কাজটি করে উপরের তিনটি অবস্থার কোনটি সেটা কলিং ফাংশনকে রিটার্ন দেওয়া। strcmp() একদম সেই কাজটিই করে। এটি হয় ধনাত্মক, বা ঋণাত্মক সংখ্যা অথবা শূন্য রিটার্ন দেয় যা উপরের তিনটি অবস্থার যে কোন একটি নির্দেশ করে।
এটা হচ্ছে কাজের ফলাফল রিটার্ন দেওয়ার একটা উদাহরণ।
অনেকসময় দেখা যায় যে, ফাংশনের দ্বারা করা কাজের ফলাফল রিটার্ন দেওয়ার মত না। যেমন, একটি array কে সর্টিং করার ক্ষেত্রে কোন ভ্যালু রিটার্ন দেওয়ার থাকে না। সেই সব ক্ষেত্রে ফাংশনটি যা রিটার্ন দিতে পারে তা হচ্ছে, তার কাজটি ঠিকমতো সম্পন্ন হয়েছে কি না সেই সংক্রান্ত তথ্য।
এই ধরনের রিটার্ন এর সবচে সহজ উদাহরণ হচ্ছে, main() ফাংশনের রিটার্ন ভ্যালু।
main() ফাংশনের কলিং ফাংশন হচ্ছে, অপারেটিং সিস্টেম। সম্পূর্ণ প্রোগ্রাম তার কাজ শেষ করার পরে যদি সফলভাবে সমাপ্ত হয়, তাহলে তার রিটার্ন ভ্যালু হয় 0। মূলত এই কারনেই আমরা সব প্রোগ্রামের শেষে return 0; কথাটি লিখি। যদি কোন প্রোগ্রাম অপারেটিং সিস্টেম কে 0 রিটার্ন না দেয় তাহলে অপারেটিং সিস্টেম ধরে নেয় যে কোন ধরণের error এর সম্মুখীন হয়েছে প্রোগ্রামটি।
রিটার্ন দেওয়া ভ্যালু, সেটা যাই হোক না কেন, রিটার্ন টাইপের সমগোত্রীয় যে কোন ভ্যারিয়েবল এ স্টোর করা যায়। কোন এক্সপ্রেশন এ সরাসরি যদি কোন ফাংশনকে ব্যবহার করা হয়, তাহলে বুঝতে হবে যে ঐ ফাংশনের মান হচ্ছে তার রিটার্ন ভ্যালুর সমান।
যেমন,
printf("%d", strlen(str));
এই ক্ষেত্রে প্রিন্ট ফাংশনের ভেতরে একটি ইন্টিজার টাইপ ভ্যারিয়েবল থাকার কথা ছিলো যা ভ্যালু প্রিন্ট হবে। কিন্তু, তার পরিবর্তে একটি ফাংশন কল আছে। মূলত এই ফাংশন কলের মান হচ্ছে ঐ ফাংশনের রিটার্ন ভ্যালু, যা এই ক্ষেত্রে প্রিন্ট হবে।
উপরের আলোচনা থেকে এতটুকু অন্তত পরিষ্কার ভাবে বুঝতে পারার কথা যে, return কোন ফাংশনের কাজের সমাপ্তি নির্দেশ করে এবং void টাইপের ফাংশন ব্যতীত সব ফাংশনই কোন না কোন ধরনের ডেটা বা তথ্য রিটার্ন ভ্যালু হিসেবে তার কলিং ফাংশনের কাছে ফেরত দেয়। রিটার্ন টাইপ হচ্ছে কোন ফাংশন কোন ডেটা টাইপের ভ্যালু রিটার্ন দিবে সেটা।
কাজেই আমরা যদি এখন থেকে
return value;
টাইপের কোন স্টেটমেন্ট দেখি তাহলে আশা করি আর বুঝতে খুব বেশি একটা সমস্যা হবে না।
return value;
এখানে value এর স্থানে রিটার্ন টাইপের সাথে মিলে যায় এমন যে কোন ডেটা সরাসরি থাকতে পারে, সেই ধরণের ডেটা বহন করে এমন ভ্যারিয়েবল থাকতে পারে, অথবা এমন কোন এক্সপ্রেশন থাকতে পারে যার চুড়ান্ত মান ঐ ডেটা টাইপের কোন ডেটা।
কাজেই যে ফাংশনের রিটার্ন টাইপ int, তার ক্ষেত্রে আমরা
return 5; লিখতে পারি, আবার
int x=5;
return x; লিখতে পারি, আবার
return 3+2;
অথবা
int a=3, b=2;
return a+b; আকারেও লিখতে পারি।
return কেবলমাত্র ফাংশনের রিটার্ন ভ্যালুর জন্য এবং ফাংশনের সমাপ্তি নির্দেশ করার জন্য ব্যবহৃত হয়।
এই রিটার্ন টাইপটা কি? রিটার্ন জিনিসটাই বা কি??
একটা ফাংশনকে কল করার উদ্দেশ্য হচ্ছে তাকে দিয়ে কোন কাজ করিয়ে নেওয়া। শুধু শুধু কোন ফাংশনকে কল করা হয় না। আগেও বলা হয়েছে, একটি C প্রোগ্রাম হচ্ছে অনেকগুলো ফাংশন কলের একটি সিরিজ। এখানে একটি ফাংশন অন্য কোন এক বা একাধিক ফাংশনকে কল করে থাকে প্রয়োজনমত বিভিন্ন কাজ করিয়ে নেবার জন্য।
কাজেই কোন ফাংশনকে কল করা হলে,
১. যে কাজটি করার জন্য তাকে ডাকা হয়েছিলো সেই কাজটি সে করে দিবে,
২. কাজটি সে সফলভাবে করতে পেরেছে কি না সেই সম্পর্কে কলিং ফাংশনকে তথ্য দিবে।
যদি এমন কোন কাজ করার জন্য কোন ফাংশনকে ডাকা হয়, যেখানে চুড়ান্ত ফলাফল একটি ভ্যালু বা ডেটা, তাহলে সেই ফাংশন তার কলিং ফাংশনকে সেই ভ্যালুটি কাজ শেষে রিটার্ন হিসেবে দেয়। এই ভ্যালু যে কোন ডেটা টাইপের হতে পারে। যেমন, ইন্টিজার, ফ্লোটিং পয়েন্ট, এরে পয়েন্টার, স্ট্রিং পয়েন্টার, স্ট্রাকচার, অন্য আরেকটি ফাংশন ইত্যাদি।
উদাহরণস্বরূপ, ২ টি স্ট্রিং কে তুলনা করার ফাংশন strcmp() এর কথা ধরা যাক। এই ফাংশনের কাজ দুটি স্ট্রিংকে লেক্সিকোগ্রাফিক্যালি তুলনা করা। যদি দুইটি স্ট্রিংকে তুলনা করা হয়, তাহলে তিনটি ঘটনা ঘটতে পারে।
১. প্রথম স্ট্রিংটি বড়, ২য় টি ছোট
২. ২য় স্ট্রিংটি বড়, ১ম টি ছোট
৩. দুটি স্ট্রিং সমান।
strcmp() ফাংশনের কাজ হচ্ছে তুলনার কাজটি করে উপরের তিনটি অবস্থার কোনটি সেটা কলিং ফাংশনকে রিটার্ন দেওয়া। strcmp() একদম সেই কাজটিই করে। এটি হয় ধনাত্মক, বা ঋণাত্মক সংখ্যা অথবা শূন্য রিটার্ন দেয় যা উপরের তিনটি অবস্থার যে কোন একটি নির্দেশ করে।
এটা হচ্ছে কাজের ফলাফল রিটার্ন দেওয়ার একটা উদাহরণ।
অনেকসময় দেখা যায় যে, ফাংশনের দ্বারা করা কাজের ফলাফল রিটার্ন দেওয়ার মত না। যেমন, একটি array কে সর্টিং করার ক্ষেত্রে কোন ভ্যালু রিটার্ন দেওয়ার থাকে না। সেই সব ক্ষেত্রে ফাংশনটি যা রিটার্ন দিতে পারে তা হচ্ছে, তার কাজটি ঠিকমতো সম্পন্ন হয়েছে কি না সেই সংক্রান্ত তথ্য।
এই ধরনের রিটার্ন এর সবচে সহজ উদাহরণ হচ্ছে, main() ফাংশনের রিটার্ন ভ্যালু।
main() ফাংশনের কলিং ফাংশন হচ্ছে, অপারেটিং সিস্টেম। সম্পূর্ণ প্রোগ্রাম তার কাজ শেষ করার পরে যদি সফলভাবে সমাপ্ত হয়, তাহলে তার রিটার্ন ভ্যালু হয় 0। মূলত এই কারনেই আমরা সব প্রোগ্রামের শেষে return 0; কথাটি লিখি। যদি কোন প্রোগ্রাম অপারেটিং সিস্টেম কে 0 রিটার্ন না দেয় তাহলে অপারেটিং সিস্টেম ধরে নেয় যে কোন ধরণের error এর সম্মুখীন হয়েছে প্রোগ্রামটি।
রিটার্ন দেওয়া ভ্যালু, সেটা যাই হোক না কেন, রিটার্ন টাইপের সমগোত্রীয় যে কোন ভ্যারিয়েবল এ স্টোর করা যায়। কোন এক্সপ্রেশন এ সরাসরি যদি কোন ফাংশনকে ব্যবহার করা হয়, তাহলে বুঝতে হবে যে ঐ ফাংশনের মান হচ্ছে তার রিটার্ন ভ্যালুর সমান।
যেমন,
printf("%d", strlen(str));
এই ক্ষেত্রে প্রিন্ট ফাংশনের ভেতরে একটি ইন্টিজার টাইপ ভ্যারিয়েবল থাকার কথা ছিলো যা ভ্যালু প্রিন্ট হবে। কিন্তু, তার পরিবর্তে একটি ফাংশন কল আছে। মূলত এই ফাংশন কলের মান হচ্ছে ঐ ফাংশনের রিটার্ন ভ্যালু, যা এই ক্ষেত্রে প্রিন্ট হবে।
উপরের আলোচনা থেকে এতটুকু অন্তত পরিষ্কার ভাবে বুঝতে পারার কথা যে, return কোন ফাংশনের কাজের সমাপ্তি নির্দেশ করে এবং void টাইপের ফাংশন ব্যতীত সব ফাংশনই কোন না কোন ধরনের ডেটা বা তথ্য রিটার্ন ভ্যালু হিসেবে তার কলিং ফাংশনের কাছে ফেরত দেয়। রিটার্ন টাইপ হচ্ছে কোন ফাংশন কোন ডেটা টাইপের ভ্যালু রিটার্ন দিবে সেটা।
কাজেই আমরা যদি এখন থেকে
return value;
টাইপের কোন স্টেটমেন্ট দেখি তাহলে আশা করি আর বুঝতে খুব বেশি একটা সমস্যা হবে না।
0 comments:
Post a Comment