الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Union

مغلق
بدأه psk_cs في 7 أكتوبر 2004 · 4 رد · 451 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

قرأت اليوم عن موضوع Union وكثرت الأسئلة علي بخصوصة

فأحببت أن أضع مافهمته ومالم افهمه

والموضوع واضعه للمناقشة فقط كي افهمه جيدا

-------------

اللي فمهمتة كالتالي:

1 - انه عبارة عن قائمة من العناصر ذات أنواع مختلفة من البيانات

2 - يتم اختيار أحد هذه العناصر فقط في الوقت نفسة

3- حجم الـUnion = حجم اكبر عنصر لدية مثال:

 
union My_union
{
int x; float y;  char m;
};

سيكون حجم  My_union = size of float

--------------

الأشياء اللي لم افهمها جيدا :

1- اولا كتبت الشيفرة التالية

union My_Union
{
	int Int;
	char Char;
	float Float;
};

void main()
{
	My_Union Obj;

printf(" Address Of Int = %d\n Address Of Char = %d\n Address Of Float = %d\n",&Obj.Int,&Obj.Char,&Obj.Float);

}

My_Union كان الناتج هو أن جميع العناصر تشير الى العنوان نفسة

بما أنها تشير الى العنوان نفسة فليش ماأعدل بنية My_Union لتكون بالشكل التالي:

union My_Union
{
	int Int;
	char Char;
	float Float;



	My_Union():Float(.5),Int(65),Char('k')
	{}

};

لما وضعت المشيّد ( لاحظ انني هيأت العنصر Int عند القيمة 65 --> كنت اتوقع انه حيكون قيمة المتغير Char = A ولكن المشكلة انه لم يحصل ذلك بل الأدهي انه لم يمهد الإ العنصر Float مع انه المفروض يهيء المتغير Char

فما هو التفسير؟

----------------------

2- ثاني شي لو نفترض بطريقة ما ان أحد العناصر لدية قيمة فكيف الطريقة لمعرفة العنصر؟

انا عملت الكود التالي (يمكن مايكون الطريقه الأفضل )

struct My_Struct
{

int MASK:

union
{
int Int;
char Char;
};

void Which_One()
{
switch(Mask)
{
case 1:
printf("its Integer");
break

default:
printf("its Character");
}
};

ملاحظة (أعرف ان التعبير عندي سيء ولكن هذا أفضل ماأستطيع)

ودمتم سالمين

#2

السلام عليكم

أخي العزيز psk_cs

بالنسبة لما ذكرت عن اليونيون فهو صحيح واضافة بسيطة ان قيمة اى متغير في اليونيون هي نفس اخر قيمة اعطيناها لاي متغير فمثلا لو اعطينا القيم التالية على التوالي:

Obj.Char=65;
Obj.Int=66;
printf("%c\n",Obj.Char);

فان النتيجة ستكون طباعة حرف B وليس A !!!!!!

لذلك عندما تريد ان تطبع عنوان العناصر فان النتيجة هي عنوان واحد.

#3

اولا شكرا اخي karimosh على محاولتك للإجابة

بالنسبة للي قلته "ان قيمة اى متغير في اليونيون هي نفس اخر قيمة اعطيناها لاي متغير "

طيب الحين انا لما عملت Construction للـUnion

union My_Union
{
int Int;
char Char;
float Float;



My_Union():Float(.5),Int(65),Char('k')
{}

};

المفروض انه تكون قيمة المتغير = K

بس صدقني ان البرنامج لم يعطني الا قيمة المتغير ( Float = .5) وهذا اللي حاط له علامة استفهام ؟؟؟؟؟

-----------

اما اللي قصدته بأنه مفروض تكون قيمة (Char = A)

هو مجرد استنتاج لكون جميع المتغيرات الـUnion تشير الى العنوان نفسه

يعني لو كان آخر قيمة ادخلناها كانت (Int = 65) ----> منطقيا قيمة (Char = A) لأنهم يشيروا الى العنوان نفسة

----------

الهدف من كل هذا الكلام انه نفسي ماانهي موضوع الـUnion الا بعد فهمة (حب استطلاع بس)

#4

إن شاء الله انا معك لحد متفهم الموضوع 100%

انا كتبت هذا الكود

#include <stdio.h>

typedef union My_Union
{
	float Float;
	int Int;
	char Char;
	My_Union():Float(.5),Int(65),Char('k'){}
}UN;

void main()
{
UN Obj;
//Obj.Char=65;
//Obj.Int=66;
printf("%f\n",Obj.Float);
printf("%d\n",Obj.Int);
printf("%c\n",Obj.Char);
}

والنتيجة كانت زي متوقعنا

0.00000

107

k

وهي مضبوطة تماما ولاحظ ان الاسكي تبع الk هو 107

#5

الله يعطيك العافية أخي karimosh

بالفعل جربت الكود اللي كتبته وطلعت النتيجة منطقيه

<--- طلع الخطأ عندي في الكود

هذا الموضوع مغلق.

مواضيع مشابهة