בעיה עם CArray |הצילו|

ronitt123

New member
בעיה עם CArray |הצילו|

אנסה לתאר את הקוד שלי:
CArray <Class A*,Class A*> A_Array; CArray <A_Array, A_Array> My_Array; My_Array[j]->A_func();//this line works. The compiler know to work with A functions. //If I try to use a pointer like this: CArray <A_Array, A_Array> *pArr; pArr[j]->A_func();//the compiler doesn't know to use A functions. //The compilter let me use only CArray functions. //What can I do in order to use A func. ??? אני מקווה שהצלחתי להבהיר את עצמי. כל עזרה תתקבל בברכה.
 

annefan

New member
הקוד שלך לא לגמרי ברור לי

אבל את צריכה לעשות עוד derefernce. My_Array הוא מערך, אבל pArr הוא מצביע לאותו סוג מערך.
 

ronitt123

New member
תודה. ועוד שאלה

עשיתי את זה כך:
A_Array *pTmpArr = &(pArr->GetAt(param)); ClassA *pAParam = (pTmpArr->GetAt(month));​
הבעיה שהקומפיילר אומר no copy constructor available . למה ומה אני יכולה לעשות???
 

annefan

New member
למה זה ברור

אין לך copy constructor... ברצינות, תעלי קוד שאפשר להבין ממנו משהו, רצוי את הקוד הקצר ביותר שאפשר לקמפל, אבל עדיין יוצר את הטעות.
 

ronitt123

New member
אנסה שוב

CArray <ClassA*,ClassA*> A_Array; CArray <A_Array, A_Array> My_Array; //Actualy I have 2 dim array //I want to get the object in [j] and use function from class A. CArray <A_Array, A_Array> *pArr; pArr = &My_Array; A_Array *pTmpArr = &(pArr->GetAt); ClassA a = pTmpArr->GetAt[j];

הקומפילר אומר לי שאין לי קופי קונסטרקטור. מה אני יכולה לעשות? מקווה שהפעם זה ברור יותר.
 

annefan

New member
A_Array הוא טיפוס?

את מעבירה ב-template של My_Array את A_Array כאילו הוא טיפוס (כמו int). אני לא רואה שום typedef, ו-CArray לא מקבל משתנים בתוך ה-template שלו.
 

ronitt123

New member
תשובה

typedef CArray<ClassA*,ClassA*> A_Array;​
בכל שאר המקומות זה עבד. לכן נראה לי שזה בסדר. איכשהוא בגלל שאני מנסה לגשת עם פוינטר, זה לא מסתדר.
 

annefan

New member
MFC זזועה!

בכל מקרה הנה הקוד שלך כשהוא מתקמפל. אזהרה ההבנה שלי ב-MFC היא ממש קטנה, והממשק שלו לא ממש אינטואיטיבי. הקוד מתקמפל, רק תבדקי טוב-טב שהוא עושה מה שאת רוצה:
int i = 0, j = 0; typedef CArray<ClassA*,ClassA*> A_Array; CArray <A_Array, A_Array> My_Array; //Actualy I have 2 dim array //I want to get the object in [j] and use function from class A. CArray <A_Array, A_Array> *pArr; pArr = &My_Array; A_Array *pTmpArr = &(pArr->GetAt(i)); // it () NOT [] ClassA * a = pTmpArr->GetAt(j); // it () NOT [] and a is a pointer. You have no cast from ClassA * which GetAt returns to ClassA
 

ronitt123

New member
תודה על הקדשת הזמן

פתאום יש לי באג אחר. כשאוכל אבדוק את התשובה שלך. שוב, המון תודה על זמנך.
 

ronitt123

New member
עוד שאלה בנושא

נראה לי שיש משהו בסיסי שאני לא מבינה. יש לי קוד:
CArray<A_Array,A_Array> *pParamatersArr; if (a_arr_type == BENCH_ARRAY) { pParamatersArr = &m_MyClass->m_oParmaters; } else if (a_arr_type == TARGET_ARRAY) { pParmatersArr = &m_MyClass->m_oTargetParmaters; } למה שתי השורות הבאות נותנות לי תוצאות שונות
int l_nEndMonth = m_MyClass->m_oParmaters[param].GetSize(); l_nEndMonth=pParmatersArr [param].GetSize(); זה כאילו השורה השניה לא מתייחסת לתוכן של האיבר הפנימי.​
 

DadleFish

New member
שאלה חשובה לי אלייך,

למה את משתמשת במבני נתונים של MFC, במקום להשתמש ב-STL הסטנדרטית?
 

ronitt123

New member
תשובות

באתי לקוד מוכן וקיים שאני צריכה להוסיף לו דברים. לא מתוך בחירה שלי. ההגדרה:
CArray<ClassA,ClassA> m_oParmaters​
אני חושבת שיש משהו בסיסי שאני לא מבינה ולכן אני מקבלת תשובות שונות. אשמח אם תוכל לעזור לי.
 

annefan

New member
רונית

כמה שאת לא מבינה את הקוד, אנחנו עוד פחות... תעשי מאמץ, להעלות קוד שמתקמפל, ועדיין יוצר את הבעיה. תראי:
CArray<A_Array,A_Array> *pParamatersArr; if (a_arr_type == BENCH_ARRAY) { pParamatersArr = &m_MyClass->m_oParmaters; } else if (a_arr_type == TARGET_ARRAY) { pParmatersArr = &m_MyClass->m_oTargetParmaters; } למה שתי השורות הבאות נותנות לי תוצאות שונות int l_nEndMonth = m_MyClass->m_oParmaters[param].GetSize(); l_nEndMonth=pParmatersArr [param].GetSize();​
יש לך במחלקה: m_oParmaters m_oTargetParmaters ויש לך גם pParmatersArr שהוא לא במחלקה. אין לי (לנו) מושג על מה את מדברת. תשתדלי להעלות את המחלקה, או חלק ממנה שרלבנטי לשאלה, יחד עם הקוד שמשתמש בה. משהו שאפשר לקמפל גם על מחשב אחר, ולראות את הבעיה. יש גם סיכוי לא קטן שכשתנסי לצמצם את הקוד, תמצאי את הבעיה.
 

ronitt123

New member
אני אנסה להסביר קצת יותר

עד עכשיו הקוד עבד עם m_MyClass->m_oParmaters. אני הייתי צריכה להוסיף מערך נוסף למחלקה m_oTargetParmaters. ע"מ שלא אצטרך לשכפל את כל הפונקציות אני מעבירה בתחילת כל פונק' enum שהוא a_arr_type למעשה סוג המערך. לפי ה enum רציתי ליצור פוינטר שיקבל את כתובת המערך הרלוונטי. המערך מורכב מעוד מערך פנימי, ז"א:
typedef CArray<ClassA*,ClasssA*> A_Array; CArray<A_Array,A_Array> m_oParmaters;​
אני בסה"כ רציתי לחסוך שכפול קוד, אבל בגלל מורכבות המערך אני לא מצליחה. אפילו את גודל המערך אני לא מקבלת בצורה זהה, כמו שכבר שאלתי קודם. עכשיו, המטרה קצת יותר ברורה? תוכל לעזור לי?
 

annefan

New member
We deal in lead

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

ronitt123

New member
הנה קוד שמתקמפל ובכ"ז לא הבנתי

הקוד:
//In class CParam: class CParam { public: CParam(); virtual ~CParam(); }; typedef CArray<CParam*,CParam*> ParamArray; //In the main class: CArray<ParamArray,ParamArray> m_oParmaters;//a member array CParam *p; p = new CParam; m_oParmaters.SetSize(10); m_oParmaters[0].Add(p); CArray<ParamArray,ParamArray> *pParamatersArr; pParamatersArr = &m_oParmaters; int nSize = 0, nSize2 = 0; nSize = m_oParmaters[0].GetSize();//return 1 nSize2 = pParamatersArr[0].GetSize();//return 10 delete p; עכשיו השאלה יותר ברורה? תוכל להסביר לי למה?​
 

annefan

New member
תני לי להבין

typedef CArray<CParam*,CParam*> ParamArray;​
את יוצרת טיפוס של מערך של מצביעים ל-CParam, וקוראת לו ParamArray.
CArray<ParamArray,ParamArray> m_oParmaters;//a member array​
אחר כך את יוצרת מערך של הטיפוסים שיצרת, בשם m_oParmaters.
m_oParmaters.SetSize(10); m_oParmaters[0].Add(p);​
עכשיו שימי לב! את מגדירה את המערך של המערכים לגודל 10, אבל מכניסה אבר למערך הראשון, שלו לא עשית SetSize (לא שזה נורא, המערך דינמי, אבל האם זה מה שרצית??) עכשיו לבעיה האמיתית, שהיא, איך לא, נסיון ליצור זהות בין מערכים למצביעים. שימי לב:
nSize = m_oParmaters[0].GetSize();//return 1 nSize2 = pParamatersArr[0].GetSize();//return 10​
בשורה הראשונה, האוביקט הוא CArray. עליו את מפעילה את אופרטור [], עם פרמטר 0, ועל האוביקט המוחזר לך, מסוג ParamArray, (אליו הכנסת את p, בלי SetSize), את מפעילה את GetSize ומקבלת 1, כמו שצריך. בשורה השניה, האוביקט הוא מצביע ל-CArray, לא CArray כמו בשורה הקודמת. על המתביע הזה את מפעילה את אופרטור [], למעשה אריתמטיקה של מצביעים, ומגיעה לאותו מקום, עכשיו כאוביקט CArray, אבל לא האוביקט שרצית, אלא המערך של המערכים, שגודלו 10 (כי עשית לו SetSize). השורה המתוקנת (בהנחה שהבנתי מה את רוצה) היא:
nSize2 = (*pParamatersArr)[0].GetSize();//return 1​
כלומר עוד dereference אחד, כדי להגיע מהמצביע לאובייקט עצמו, ועל האבר הראשון באותו אוביקט, להפעיל GetSize. נראה לי שזהו.
 
למעלה