سي پروگرامنگ ۾ اتحادون


هڪ پروگرام تي غور ڪريو ، جنهن کي ماڻهون جو قسم قبول ڪرڻو آهي - شاگرد يا ملازم ۽ ان جي قسم مطابق هن کي پنهنجو طبقو يا ڊپارٽمينٽ ڏيکارڻو آهي. هتي چال ڪلاس هوندي آهي ۽ ڊپارٽمينٽ شاگرد يا ملازم لاءِ صحيح ناهي. انهن مان ڪنهن کي به هڪ لاءِ صحيح هوندي. ان جو مطلب اهو آهي ته ٻئي طبقو ۽ ڊپارٽمينٽ ڪنهن شخص جي قسم لاءِ سرگرم نه هوندا. هن جو مطلب جيتوڻيڪ اسان وٽ ڪلاس ۽ ڊپارٽمنٽ کي اسٽور ڪرڻ وارا پروگرام ۾ ٻه متغير آهيون ، اسان انهن مان ڪنهن کي استعمال ڪنداسين. پر جيئن ته اسان پهريان ئي knowاڻون ٿا ، متغير جو اعلان ڪندي ، يادگيريءَ ۾ ڪجهه جڳهه تي قبضو ڪيو وڃي. هتي اسان جي صورت ۾ جڏهن اسين ٻه متغيرات جو اعلان ڪيون ٿا ، ياداشت سڀني متغيرن تي مختص ڪئي وئي آهي جڏهن ته اسان صرف انهن مان هڪ استعمال ڪندي آهيون. مطلب ته ياداشت ٻين متغير لاءِ مختص ٿيل آهي فضول آهي. جيڪڏهن هڪ پروگرام تمام نن smallڙو آهي ۽ اسان جي ذاتي ڪمپيوٽر ۾ هلندڙ آهي اهڙي قسم جي ميموري ضايع قابل قبول ٿي سگهي ٿي. پر جڏهن اسان وڏا پروگرام لکندا آهيون جتي ڪيترائي آپريشن ڪيا ويندا آهن ، اسان يادگيري جي جڳهه کي غير ضروري طور ضايع نٿا ڪري سگهون.

مٿين صورت ۾ اسان ڪلاس ۽ ڊپارٽمينٽ ٻنهي کي رکڻ لاءِ واحد متغير استعمال ڪري سگهون ٿا ، جهڙوڪ اسان فرد جي قسم بڻايون ٿا ، جتي اسان قدر داخل ڪريون شاگردن يا ملازمن جي. ساڳي طرح اسين ڪلاس آئي ڊي ۽ ڊپارٽمينٽ آئي ڊي داخل ڪري ٻي ڪيريئر ۾. پر تصور ڪريو طبقو قسم جو آهي ۽ ڊپارٽمينٽ قسم جو آهي! هاڻي اڪيلو متغير استعمال نٿو ڪري سگهجي. اسان کي جدا جدا ٻن متغيرن جي ضرورت آهي ، پر اهو هتي ميموري ضايع ڪندو. ان جو مطلب آهي ته اسان کي ٻن قسمن جي متغيرات جي ضرورت آهي - int ۽ char ۽ يادگيري کي ضايع نه ڪيو وڃي. سي ۾ اها گهرج ڪيئن حاصل ڪجي؟

مٿي issueاڻايل مسئلي کي حل ڪرڻ لاءِ سي ، ڊيٽ قسم جو ٻيو قسم متعارف ڪرائي ٿي- يونين جيڪا جوڙجڪ وانگر آهي پر جوڙجڪ کان ڌار آهي. ان جو مطلب آهي اتحاديون ساخت وانگر آهن پر ياداشت کي مختص ڪرڻ ۾ مختلف آهن. Inانچي ۾ ، ياداشت سڀني ميمبرن لاءِ مختص ڪئي وئي آهي - يعني ؛ اهو جوڙجڪ جي انفرادي ميمبرن جي ياداشت جي مقدار جو مجموعو آهي. پر اتحاد ۾ ، يادگيري اهڙي طريقي سان مختص ڪئي وئي آهي ته اها پنهنجي سڀني ميمبرن کي ان اندر جمع ڪرڻ جي قابل نه رهندي. يعني ؛ يونين جو ميموري سائز يونين جي سڀني کان وڏي ميمبر جي يادگيري جو سائز آهي ان ڪري جڏهن اسان طبقاتي ۽ ڊپارٽمنٽ ٻنهي کي گڏيل رکڻ جي لاءِ يونين ٺاهينداسين ، اها ميموري اهڙي طرح تفويض ڪري ڇڏيندي ته هن يونين ۾ سڀني کان وڏي عنصر يونين جو سائز ٿيندو. ان ڪري ٻنهي ميمبرن کي رکڻ جي گنجائش نه هوندي. اهو هڪٻئي کي سڀني جو پابند رکي سگهي ٿو. اهڙي طرح اتحادين ميموري جي جڳهه کي ضايع ڪرڻ کانسواءِ ٻن متغيرن جي ضرورت کي حل ڪرڻ جي قابل ٿي وينديون. اتحادين جي اها طاقتور خاصيت سي ٻولي کي وڌيڪ مضبوط بڻائي ٿي.

يونين ٺاهيندي

اتحادون ساڳيءَ طرح ٺهيل هونديون آهن ، پر بنيادي طور لفظ يونين ٺاهڻ سان.

اتحاد ٺاهڻ لاءِ عام نحو هيٺ ڏجي ٿي.

union union_name{
	datatype variable1;
	datatype variable2;
	….
	datatype variableN;
};

اڏاوتن وانگر ، Union_name يونين جو نالو آهي ، ڊيٽائپ قسم ڪنهن به ابتدائي يا غير ابتدائي ڊيٽا ڊيٽ ٿي سگهي ٿي. ان ۾ لاتعداد تعدادن ۾ موجود هوندا ، انهي مان صرف هڪ ئي وقت تي پهچائي سگهجي ٿي.
union category {
	int intClass;
	char chrDeptId [10];
};

مٿين هڪ مثال يونين اتحاد جو اڃا تائين بحث ٿيل آهي. هن يونين ، ڪيٽيگري ۾ ٻه عنصر IntClass عدد قسم جا ۽ chrDeptId ڪردار جا قسم شامل آهن. جيتوڻيڪ ان جا ٻه عنصر آهن ، صرف انهن مان هڪ هڪ ئي وقت فعال هوندو. اهو ئي سبب آهي ، هن يونين وٽ صرف 10 بائيٽ ياداشت جي گنجائش هوندي. (chrDeptId جي ميموري سائيز جيڪا intClass جي مقابلي ۾ وڏي آهي). انهي ڪري ان ۾ ٻئي IntClass ۽ chrDeptId رکڻ جي جڳهه ناهي. اها ئي اسان جي ضرورت پڻ آهي.

اعلان ڪندي يونينون

ساخت وانگر ، مٿي يونين جو unionانچو آهي. يونينن جي رسائي حاصل ڪرڻ لاءِ اسان هن يونين جي ساڪن کي استعمال ڪندي يونين ويچارن کي اعلان ڪرڻ جي ضرورت آهي. يونين بدلجڙا پيدا ڪرڻ جا مختلف طريقا آهن.

يونين جي وضاحت ڪندي

جڏهن ته يونين جي تعريف / فڪر کي پاڻ وضاحت ڪندي ، اسان يونين متغيرات ٺاهي سگهون ٿا.

union category {
	int intClass;
	char chrDeptId [10];
} student_category, emp_categeory;

هتي اهو ٺاهي ٿو ٻه يونين متغيرات student_category ۽ emp_categeory type type.

يونين جي تعريف ڪرڻ کان پوءِ

اتحاد جي بناوت کي طئي ڪرڻ کان پوءِ ، اسان يونين متغير به ٺاهي سگهون ٿا. لاٽري اسان هن يونين نالي کي استعمال ڪري سگهون ٿا ان جي تغيرات ٺاهڻ لاءِ.

union category {
	int intClass;
	char chrDeptId [10];
};
union category student_category, emp_categeory;

typedef استعمال ڪرڻ

Typedef استعمال ڪري سگھجن ٿا استعمال ڪندڙ بيان ڪيل متغير. هتي جيڪڏهن اسان کي يونين جي وضاحت ڪرڻ بعد يونين ورڪرز ٺاهڻيون پوندا آهن ، ته پوءِ اسان کي 'يونين ڪٽيگري variab_names' مان مڪمل شڪل طئي ڪرڻو پوندو. پر جيڪڏهن اسان شروعات ۾ ٽائپفيم استعمال ڪندا آهيون ، اهو پنهنجو نن shڙو نالو سان نئون ڊيٽائپ ٺاهيندو. اھو س meaningfulو ڊگھو اعلان نن smallerڙي معنيٰ جي نالي ڏانھن.

typedef union category {
	int intClass;
	char chrDeptId [10];
}categ;
categ student_category, emp_categeory;

يونين عناصر کي شروعات ڪرڻ

وانگر اسان اڳ چيو ، ڪوبه ميمبر ڪنهن وقت ۾ اتحادين ۾ سرگرم ٿي سگهي ٿو. ان ڪري اسان يونين جي ڪنهن به ميمبر کي شروعات ڪري سگهو ٿا.

اتحادن جي عنصر کي شروعات ڪرڻ جا مختلف طريقا آهن.

يونين جي متغيرات کي اعلان ڪرڻ دوران

جيئن اسين ساخت جي عنصرن جي شروعات ڪريون ٿا ، اسين ان اتحاد جي عنصرن کي به شروع ڪري سگهون ٿا ، پر يونين جو ڪو به ميمبر.

union category {
	int intClass;
	char chrDeptId [10];
} student_category = {10}; // this will initialize intClass

هتي شاگرد _ ڪيٽيگري ، يونين متغير آهي ۽ ان جي ابتدائي عنصر ـ Intassass کي 10. جڏهن اسان شروع ڪرڻ دوران ڪنهن عنصر جو نالو واضح نه ڪيو آهي ، اهو پهرين عنصر کي شروع ڪري ٿو.
union category {
	int intClass;
	char chrDeptId [10];
};
union category student_category = {10}; // this will initialize intClass

هن طريقي سان اسان صرف يونين جي پهرين عنصر کي شروع ڪري سگهون ٿا.

عنصر جا نالا بيان ڪندي

هي يونين جي عنصرن بابت شروعات ڪرڻ جو هڪ ٻيو طريقو آهي. هتي اسين واضح طور تي ميمبرن جا نالا واضح ڪري سگهون ٿا جن لاءِ اسان اقدار ترتيب ڏيڻ گهرجن.

union category {
	int intClass;
	char chrDeptId [10];
};
union category student_category = {.intClass= 10}; // this will initialize intClass
union category emp_categeory = {.chrDeptId= "DEPT_100”}; // this will initialize chrDeptId

OR
union category {
	int intClass;
	char chrDeptId [10];
};
union category student_category;

شاگرد_ ڪيٽيگريٽري.intClass = 10 ؛ // هي شروعات شروع ٿيندي IntClass
strcpy (شاگرد_ ڪيٽيگري.چ آر ڊپي آئيڊ ، “DEPT_100”); // اهو يونين متغير student_category تي chDDeptId شروع ڪندو ، پر اهو IntClass جي قيمت کي وڌيڪ دٻائي ڇڏيندو جنهن جي هن وقت ڳچيءَ واري قيمت هوندي

يونين جي عنصرن جي رسائي

يونين جي عناصر تائين رسائي ساڳئي ريت structureاڻايل عناصر وانگر. اسان استعمال ڪريون ٿا '. ان جي عنصرن جي حوالي ڪرڻ.

شاگرد_ ڪيٽيگريٽري.intClass = 10 ؛ // هي شروعات شروع ٿيندي IntClass
strcpy (شاگرد_ ڪيٽيگري.چ آر ڊپي آئيڊ ، “DEPT_100”);

#include 
#include 

void main () {

	union category {
		int intClass;
		char chrDeptId [10];
	};
	union category std_ctg;

	std_ctg.intClass = 10; // this will initialize intClass
	printf ("Value of intClass in Student_category is: %d\n", std_ctg.intClass);

	strcpy (std_ctg.chrDeptId, "DEPT_100");
	printf ("Value of chrDeptId in Student_category is: %s", std_ctg.chrDeptId);
}

يونين جو قطار

اڏاوتن جي قطار وانگر اسان اتحادين کي به ٺاهي سگهون ٿا ۽ ساڳئي طرح انهن تائين رسائي ڪري سگهون ٿا. جڏهن اتحادين جي صف ٺاهي وڃي ته ان ۾ ارون جي هر عنصر ٺاهي ويندي انفرادي اتحاد جي سڀني خاصيتن سان اتحاد جي. ان جو مطلب ، هر آرٽ عنصر هڪ يادگيري مختص ڪئي ويندي جيڪا يونين ميمبر جي وڌ کان وڌ سائز جي برابر آهي ۽ يونين جي ڪنهن به ميمبر کي ايري عنصر ذريعي پهچايو ويندو.

union category {
	int intClass;
	char chrDeptId[10];
};
union category catg [10]; // creates an array of unions with 10 elements of union type

يونين جي صف جي ميمبرن تائين رسائي حاصل ڪئي وڃي ٿي '. آپريٽر يونين متغير نالي سان گڏ انڊيڪس سان گڏ ٻڌائڻ لاءِ ته انهي ترتيب واري عنصر جو اسان رسائي ڪري رهيا آهيون.

catg [0] .intClass = 10 ؛
catg [5] .chrDeptId = “DEPT_001”;

هتي ياد رکجي ته ، يونين آرٽ جو هر عنصر يونين جي ساڳئي ميمبر تائين رسائي جي ضرورت ناهي. ان ۾ ڪنهن به وقت ، يونين جو ميمبر ميمبر ٿي سگهي ٿو. مٿين مثال ۾ ، يونين اسٽيل جو پهريون عنصر intClass تائين رسائي جڏهن ته يونين آرٽ جو 6th عنصر پنهنجي ميمبر طور chrDeptId آهي.