সি প্রোগ্রামিং এ ফাংশনের মধ্য দিয়ে কিভাবে স্ট্রাকচারকে অতিক্রম করাবেন?
সি প্রোগ্রামিং এ ফাংশনের মধ্য দিয়ে কিভাবে স্ট্রাকচারকে অতিক্রম করাবেন?
সি প্রোগ্রামে structure কে function এর মধ্য দিয়ে দুইভাবে অতিক্রম(pass) করানো যায়ঃ
স্ট্রাকচারকে ভ্যালু হিসাবে অতিক্রম করানো
সাধারণ ভ্যারিয়েবলের মত স্ট্রাকচারকেও(structure) ফাংশনের মধ্য দিয়ে আর্গুমেন্ট(argument) হিসাবে অতিক্রম করানো যেতে পারে।
যদি স্ট্রাকচারকে ফাংশনের মধ্য দিয়ে ভ্যালু হিসাবে অতিক্রম(pass) করানো হয় তাহলে ফাংশন ডেফিনিশন(definition) এর মধ্যে স্ট্রাকচার ভ্যারিয়েবলের পরিবর্তন ঘটলেও অরিজিনাল স্ট্রাকচার ভ্যারিয়েবলে কোনো ধরনের প্রভাব ফেলবে না।
উদাহরনঃ student নামের একটি স্ট্রাকচার তৈরির জন্য সি প্রোগ্রাম, যাতে স্ট্রাকচার এর মেম্বার হিসাবে স্টুডেন্টের নাম ও রোল নাম্বার রয়েছে এবং তথ্য প্রদর্শনীর জন্য display() ফাংশন ব্যবহার করা হয়েছে।
#include <stdio.h>
struct student
{
char name[50];
int roll;
};
void display(struct student stu);
// ফাংশনের প্রোটোটাইপ(prototype) স্ট্রাকচার ডিক্লেয়ারেশনের নিচে থাকা উচিৎ অন্যথায় কম্পাইলার এরর(error) দেখাতে পারে।
int main()
{
struct student stud;
printf("Enter student's name: ");
scanf("%s", &stud.name);
printf("Enter roll number:");
scanf("%d", &stud.roll);
display(stud); //স্ট্রাকচার ভ্যারিয়েবল p stud কে আর্গুমেন্ট হিসাবে অতিক্রম করানো।
return 0;
}
void display(struct student stu){
printf("Output\nName: %s",stu.name);
printf("\nRoll: %d",stu.roll);
}
আউটপুট
Enter student's name: Tamim Enter roll number: 5 Output Name: Tamim Roll: 5
স্ট্রাকচারকে রেফারেন্স হিসাবে অতিক্রম করানো
স্ট্রাকচারকে রেফারেন্স হিসাবে ফাংশনের মধ্য দিয়ে অতিক্রম করানো হলে স্ট্রাকচার ভ্যারিয়েবলের মেমোরি এড্রেস ফাংশনের মধ্য দিয়ে অতিক্রম করে।
যদি স্ট্রাকচারকে ফাংশনের মধ্য দিয়ে রেফারেন্স(reference) হিসাবে অতিক্রম(pass) করানো হয় তাহলে ফাংশন ডেফিনিশন(definition) এর মধ্যে স্ট্রাকচার ভ্যারিয়েবলের পরিবর্তন ঘটলে অরিজিনাল স্ট্রাকচার ভ্যারিয়েবলেও প্রভাব পড়বে।
ফুট-ইঞ্চিতে দুটি দূরত্বের যোগ এবং রিটার্ন স্টেটমেন্ট ব্যবহার না করে ফলাফল প্রদর্শনীর জন্য সি প্রোগ্রাম।
#include <stdio.h>
struct distance
{
int feet;
float inch;
};
void add(struct distance d1,struct distance d2, struct distance *d3);
int main()
{
struct distance dist1, dist2, dist3;
printf("First distance\n");
printf("Enter feet: ");
scanf("%d", &dist1.feet);
printf("Enter inch: ");
scanf("%f", &dist1.inch);
printf("Second distance\n");
printf("Enter feet: ");
scanf("%d", &dist2.feet);
printf("Enter inch: ");
scanf("%f", &dist2.inch);
add(dist1, dist2, &dist3);
/* dist1 এবং dist2 স্ট্রাকচার ভ্যারিয়েবলকে ভ্যালু হিসাবে এবং dist3 স্ট্রাকচার ভ্যারিয়েবলকে রেফারেন্স হিসাবে ফাংশনের মধ্য দিয়ে অতিক্রম(pass) করানো */
printf("\nSum of distances = %d\'-%.1f\"", dist3.feet, dist3.inch);
return 0;
}
void add(struct distance d1,struct distance d2, struct distance *d3)
{
// d1 এবং d2 দূরত্বকে যোগ করে d3 এর মধ্যে জমা রাখা
d3->feet = d1.feet + d2.feet;
d3->inch = d1.inch + d2.inch;
if (d3->inch >= 12) { /* ইঞ্চির ভ্যালু যদি ১২ থেকে বড় হয় তাহলে ফুটে রূপান্তরিত হবে। */
d3->inch -= 12;
++d3->feet;
}
}
আউটপুট
First distance Enter feet: 24 Enter inch: 7.8 Second distance Enter feet: 7 Enter inch: 5.6 Sum of distances = 32'-1.4"
- উপরের প্রোগ্রামে dist1 এবং dist2 স্ট্রাকচার ভ্যারিয়েবলকে
add
ফাংশনের মধ্য দিয়ে ভ্যালু(value) হিসাবে অতিক্রম(pass) করানো হয়েছে। কারণ dist1 এবং dist2 কে main() ফাংশনের মধ্যে প্রদর্শনীর প্রয়োজন নাই। - কিন্তু dist3 কে রেফারেন্স হিসাবে অতিক্রম করানো হয়েছে। অর্থাৎ dist3 এর এড্রেসকে(
(&dist3)
) ফাংশনের আর্গুমেন্ট হিসাবে অতিক্রম করানো হয়েছে। - এই কারণে main ফাংশন থেকে
add
ফাংশনকে কল(call) করলেadd
ফাংশনের মধ্যে d3(স্ট্রাকচার পয়েন্টার ভ্যারিয়েবল) dist3 (স্ট্রাকচার ভ্যারিয়েবল) এর এড্রেসকে নির্দেশ(point) করে। তাই d3 ভ্যারিয়েবলে কোনো পরিবর্তন আনলে main ফাংশনের dist3 ভ্যারিয়বলে তা দেখা দেয়। - ফলে সঠিক যোগফল আউটপুটে প্রদর্শীত হয়।