עזרה בבעיה ב C

עזרה בבעיה ב C

שלום יש לי בעיה שאני צריך בזמן הריצה להגדיר שמשנה יהיה מסוגים שונים דוגמא פעם אחת אני רוצה שמשתנה A יהיה מסוג INTEGER ופעם אני רוצה אותו מסוג SHORT כרגע אני משתמש בתנאים של DEFINE לעשות TYPEDEF אבל אני צריך משהו שמשתנה בזמן ריצה ולא בקומפילציה האם יש דרך לעשות את זה ואם לא אילו דרכים יש לעקוף את הבעיה? תודה מראש.
 

vinney

Well-known member
זה לא עונה לי על השאלה

שאלתי "מה אתה מנסה לעשות בדיוק?" איך הגעת לצורך הזה שאתה מתאר?
 

erezsh

New member
זה פשוט למדי

במיוחד לצורך זה המציאו משהו שנקרא union. תקרא על זה קצת.
 
union לא עוזר לי האם יש משהו אחר?

קודם כל תודה רבה שכחתי מהעניין אבל זה עדיין לא עוזר לי כי אני צריך לדעת את הסוג לפני כל שימוש ואת השם המתאים, בעיקרון יכולתי להגדיר מצביעים מסוגים שונים עם שמות שונים למקום אחד בזיכרון וזה היה נותן לי את אותו דבר. הבעיה שלי היא שיש לי אובייקט עם DATA MEMBER מסויים שבתחילת כל ריצה אני רוצה לבחור את הסוג שלו אבל להשאיר לו את אותו שם כדי שאני אוכל להשתמש בו בכל המתודות, כדי לפשט את העניין מדובר בתוכנית שמקליטה שמע ואני רוצה לבחור איכות בכך שאני שומר ב SHORT 16BIT או FLOAT 32BIT בעיקר ואני צריך לבצע עליהם תמיד אותם פעולות ולכן זה נראה לי קצת מוגזם לעשות OVERLOADING לכל המתודות, כרגע כפי שאמרתי שאני משתמש בDEFINE כדי להחליט איזה סוג TYPEDEF מסויים ומשתמש בו בכל הפונציות וזה סבבה אבל אני לא יכול לבחור בזמן ריצה.
 

vinney

Well-known member
באיזו שפה אתה עושה את זה?

אם ב++C - תעשה OVERLOAD ותשתמש במחלקה אם בC - תשתמש בvoid*, ותעשה CASTING בזמן ריצה לפי ההחלטה (switch פשוט). בנוסף, פתרון הUNION הוא מצוין לזה, לא ברור לי למה הוא לא עוזר לך.
 
זה לא עוזר כי..

אני משתמש ב C++ אני מודע לאפשרות של CASEים ותנאים אבל זה נראה לי פתרון מאד מכוער כשהקוד בסך הכל יעבוד עם כל הסוגים גם ככה והייתי מעוניין פשוט להשתמש באותו שם והגדרות ורק לשנות את הסוג. בנוסף לUNION יש בעיה נוספת מבחינתי שמדובר במקום בזיכרון. לפי ההבנה שלי UNION תופס בזיכרון את השטח הכי גדול מכל הסוגים ואם אני שומר במערך הקלטה באיכות 16BIT למשך 5 שניות אני מבזבז 861KB במקום 430. תודה בכל מקרה
 

selalerer

New member
אתה יכול להשתמש בRTTI?

זה נשמע לי כמו מקרה קלאסי בשביל זיהוי סוגים בזמן ריצה.
 

vinney

Well-known member
../images/Emo45.gifלא ראיתי שכבר ענית ../images/Emo13.gif

 

vinney

Well-known member
אז יש כמה דרכים

א. כמו שאמרתי - VOID* וCASTING בזמן ריצה בקביעת הפונקציה - זה כתיבה של SWITCH עם 3 אפשרויות ומצביע לפונקציה, לא מכוער ולא בטיח, קביל בהחלט. ב. אם אתה משתמש ב++C אז מתבקש שתעבוד עם מחלקות שהן VIRTUAL ותן לRTTI להחליט על טיפוסים, אם הפעולות אותן פעולות - מבחינתך 0 עבודה.
 
תודה רבה לכם

אני חושב שזה בדיוק מה שחיפשתי והיה חסר לי אני אשמח לקבל כתובת לאיזה מקום טוב שניתן לקרוא על זה והייתי רוצה לדעת עד כמה זה נתמך כלומר אני כרגע עובד עם VC6 אבל אני דיי צריך שזה יעבוד גם בMAC ולינוקס
 

erezsh

New member
union תופס בזיכרון הכי הרבה??

איך הגעת למסקנה הזו?
 

vinney

Well-known member
מה יש לשכנע?

מה שהוא כתב נכון - גודל של הUNION נקבע לפי גודל המשתנה הכי גדול בתוכו. במקרה שלו UNION באמת נורא בזבזני.
 

erezsh

New member
אה, אני מצטער,

RTTI בכלל לא עושה bloat ענקי לכל הקוד (שלא לדבר על מהירות). העוד 4 בתים האלה שהוא מבזבז ב-union פשוט לא משתווים.
 

erezsh

New member
סליחה, 2

למרות שבמחשבה קצת יותר מפוכחת, הויכוח הזה מיותר
 
למעלה