זיהוי סוג המידע

עידו123456

New member
זיהוי סוג המידע

הסיפור הוא כזה: הגדרתי מבנה נתונים של מספרים וכדי לא לפגוע בג'נריות, יצרתי הכרזה כזאת בתחילת המבנה נתונים: typedef float tData כשאני מצפה שהשינוי היחידי האפשרי יהיה מ float ל double כעת יש לי פונקציה שצריכה להתבצע על הנתונים ואני משתמש בתוכה בפונקציה חיצונית - כאשר יש שתי פונקציות שעומדות לרשותי - פונקציה אחת ל float ואחת ל double כשהן נבדלות בשם וכמובן בסוג הערכים שהיא מקבלת. האם יש דרך לזהות איזה סוג מידע מכיל tData (האם זה float או double) כדי שאני אוכל להשתמש בפונקציה הנכונה בכל אחד מהמקרים?
 

eyalbd

New member
זה C או ++C?

כי אם זה ++C אז templates יפתרו לך את הבעיה די בקלות
 

עידו123456

New member
יש בזה משהו... לא חשבתי על זה../images/Emo163.gif

יש אולי אבל פיתרון אחר? זה יאוש עכשיו להמיר את זה ל template... |עצלן| תודה בכל מקרה
 

eyalbd

New member
אתה לא חייב לכתוב מחדש

ע"י שימוש ב traits אפשר לבצע dispatch בזמן קומפילציה דוגמא:
#include <stdio.h> // Pre existing float implementation // void call_float(float f) { printf("call_float(%f)\n", f); } // Pre existing double implementation // void call_double(double d) { printf("call_double(%lf)\n", d); } // Let's build a framework of compile time dispatch // template <typename T> struct DispatchTraits {}; // Specialization for float // template<> struct DispatchTraits<float> { static void make_a_call(float f) { call_float(f); } }; // Specialization for double // template<> struct DispatchTraits<double> { static void make_a_call(double d) { call_double(d); } }; // Now use the mini-framework we built // template <typename T> inline void call_implementation(T t) { DispatchTraits<T>::make_a_call(t); } int main() { double d = 8.0; call_implementation(d); float f = 9.0; call_implementation(f); }​
 

voguemaster

New member
אולי...

אתה יכול להשתמש ב-sizeof של tData. זו עובדה שלא תשתנה אי פעם שהגודל של single precision יהיה שונה מזה של double precision ולכן אפשר לסמוך על זה עקרונית. רק צריך מנגנון שיעבוד בצורה יעילה. כלומר לבצע את הבדיקה פעם אחת ואז לדעת לקרוא לפונק' המתאימות ללא צורך בבדיקה חוזרת.
 

זהיר

New member
ממש לא לא לא

מתוך K&R2 A.4.2 Any of single precision floating point (float), double precision floating point (double), and extra precision floating point (long double) may be synonymous, but the ones later in the list are at least as precise as those before. תכנתו בזהירות
 

voguemaster

New member
ובאיזה פלנטה זה קורה ???

לא ראיתי מימוש אחד שבו float באותו גודל של double.
 

זהיר

New member
בפלנטה של C הסטנדרטי

כיוון שאני כותב C סטנדרטי אני לא צריך לחקור שום מחשב שיריץ את התוכנה שלי - גם לא מחשב שיופיע בעוד שנתיים. אתה, לעומת זאת, תוכל לטעון שהמחשב ההוא "דפוק". שיהיה! תכנתו בזהירות
 

cybordyn

New member
יש כאן שני מצבים.

יש כאן שתי אפשרויות: אם אתה עושה את השינוי של ה typedef ל: typedef double tData ורוצה לקמפל מחדש, אז פשוט תגדיר את הפרמטר שהפונציה מקבלת כ tData אם אתה רוצה לזהות את סוג הפרמטר תוך כדי ריצה on the fly תוכל ב C++ להגדיר overloaded function כאשר באחת הפרמטר יהיה float ובשניה double. מה שאומר, שיש שתי פונקציות בעלות אותו שם, והפונקציה הנכונה מזומנת לפי הטיפוס של הפרמטר. בכל מקרה, התשובה שניתנה לך שמדברת על שימוש ב sizeof יכולה להיות ישימה רק במצב שאתה מקמפל את התכנית לכל טיפוס מחדש, כי sizeof מחושב בזמן הקומפילציה.
 
נשמע ש templates יעזור , ואולי גם..

you might wanna use rtti ( run time type info ) : // expre_typeid_Operator.cpp // compile with: /GR /EHsc #include <iostream> #include <typeinfo.h> class Base { public: virtual void vvfunc() {} }; class Derived : public Base {}; using namespace std; int main() { Derived* pd = new Derived; Base* pb = pd; cout << typeid( pb ).name() << endl; //prints "class Base *" cout << typeid( *pb ).name() << endl; //prints "class Derived" cout << typeid( pd ).name() << endl; //prints "class Derived *" cout << typeid( *pd ).name() << endl; //prints "class Derived" delete pd; }
 
למעלה