אפשר הסבר על union?

DadleFish

New member
union זה C, לא ++C

(אם כי קיים גם ב-C). ב-UNION, כל משתנה שאתה מגדיר מתחיל מאותה הנקודה בזכרון, כאשר הגודל של ה-UNION כולו הוא כגודל המשתנה הגדול ביותר. למשל,
union myUnion_t { int n; float f; char ch[8]; };​
גודל ה-UNION הזה יהיה 8 בתים, כי האיבר הגדול ביותר הוא מערך ה-char-ים. אם תכניס ל-n את הערך 0xFF004421, למשל, תקבל ב-[ch[3 את הערך 0x21. אם תעשה [ch[2]=ch[1 למשל, תקבל ב-n את הערך 0xFF000021. ב-f תראה את הערך כמו שהוא מתאים ל-float (מבחינת הייצוג של הנקודה הצפה).
 

vinney

Well-known member
לא מדויק

הקטע של הINT. אל תשכח שבמחשבים שונים הייצוג של INT משתנה (הEndian הידוע), לכן UNION זה דבר מסוכן מאוד - מה שבמחשב אחד יפרוש INT לCHARים בצורה אחת, במחשב אחר יכול להפרש אחרת. זה יכול לפגוע בפורטביליות ולא ממש מומלץ.
 

ilankt

New member
רק רציתי לראות מה הקשר של

union לבין D3DXMATRIX (המבין יבין)
 

DadleFish

New member
פשוט מאוד.

מה שאתה רואה ב-MSDN הוא לא התמונה המלאה, ולא ברור לי למה הם בחרו להראות אותה ככה. ב-MSDN, המבנה נראה ככה:
typedef struct D3DXMATRIX { union { float m[4][4]; }; } D3DXMATRIX;​
וזה די חסר הגיון, כי אין משהו חוץ מה-float. אבל, אם תחקור קצת לעומק, תראה ש-D3DXMATRIX הוא בעצם struct שיורש מ-D3DMATRIX, שנראית ככה:
typedef struct _D3DMATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float m[4][4]; }; } D3DMATRIX;​
ואז זה כבר שונה. המטריצה מקבילה ל-16 ה-float-ים. כנראה שלמיקרוסופט היה יותר נוח לפנות אל המשתנים בצורה כזו (בדידה) מאשר בצורת המטריצה הישירה.
 
למעלה