נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: void pointers בבקשה עזרה!!

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 13 April 2007 בשעה 00:49 | IP רשוּם
ציטוט אורח

מישהו יכול להסביר לי איך משתמשים בפויינטרים האלו ואם אפשר לכתוב פונקציה המקבלת ערכים מסוג מצביע לVOID וגם מחזיר ערכים כאלה. הבעיה היא כזאת אני צריך לכתוב תוכנית על עצי AVL שמכילה עצים עם structes שונים אבל בכלליות רב הפונקציות יכולות להתאים לכל סוגי הstructe אבל איזה סוג ערך הפונקציה תקבל ותחזיר???
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
צחי@
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 02 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 13 April 2007 בשעה 22:23 | IP רשוּם
ציטוט צחי@

זה ב-C או C++ ?
אם זה C++ אז הדרך הטובה לעשות זאת היא לא עם פויינטרים ל-VOID אלא עם מחלקות והורשה או TEMPLATES - תלוי בצרכים.
לגבי C, אם אני הייתי צריך לממש את זה, אז הייתי מגדיר NODE בעץ ככה:
קוד:

typdef struct t_Node
{
   int key;
   void *data;
} Node;


כאשר data הוא מצביע לכל סוג data שאתה רוצה להחזיק בעץ. הפונקציות של החיפוש/הכנסה מקבלות Node כזה שמאותחל כל פעם בהתאם לסוג ה-Struct הרצוי עם casting ל-*void.
לדוגמא:

קוד:

typdef struct t_Item
{
   float price;
   int count;
   int ID;
} Item;

Item item;

item.price = 5.0f;
item.count = 3;
item.ID = 1245;

Node node;
node.key = 5;
node.data = (void*)&item;

head = InsertToTree(node);




חזרה לתחילת העמוד הצג את כרטיס החבר של צחי@ חפש הודעות אחרות של צחי@ בקר בדף הבית של צחי@
 
אורח אחר
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 15 April 2007 בשעה 19:28 | IP רשוּם
ציטוט אורח אחר

יש לי את אותה בעיה וניתי ליישם את ההצעה אבל זה לא עובר קימפול:

dereferencing `void *' pointer

 request for member `name' in something not a structure or union

???????????

מה הוא רוצה? איך אפשר לפתור את זה?

תודה לעונים... 

חזרה לתחילת העמוד הצג את כרטיס החבר של אורח אחר חפש הודעות אחרות של אורח אחר בקר בדף הבית של אורח אחר
 
צחי@
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 02 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 15 April 2007 בשעה 19:58 | IP רשוּם
ציטוט צחי@

אורח אחר, איך אתה מצפה שנעזור לך לפתור את הבעיה אם אתה לא מצרף את הקוד שלך ?
כנראה לא עשית casting חזרה מ-*void ל-struct הרלוונטי.
איך לתקן את זה בקוד שלך ?
- צריך לראות את הקוד בשביל להגיד.
חזרה לתחילת העמוד הצג את כרטיס החבר של צחי@ חפש הודעות אחרות של צחי@ בקר בדף הבית של צחי@
 
yigael_o
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 25 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 30
נשלח בתאריך: 15 April 2007 בשעה 20:04 | IP רשוּם
ציטוט yigael_o

אתה יכול להכנייס את הקוד שלך? לפי מה שרשמת אני מנחש (לפחות עד שתיתן קוד) שיש לך CLASS שקוראים לו SOMTHING ואתה מנסה להגדיר משתנה מסוג NAME במקום VOID* . וכמובן שלא הגדרת CLASS או STRUCT מסוג NAME.

תכניס קוד ואז נראה בדיוק מה הבעיה

חזרה לתחילת העמוד הצג את כרטיס החבר של yigael_o חפש הודעות אחרות של yigael_o
 
אורח אחר
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 15 April 2007 בשעה 21:58 | IP רשוּם
ציטוט אורח אחר

אלו ה-structים שהגדרתי:(ואין לי מושג מה זה class)

typedef struct Country_t
{
 char name[SIZE];
 int gold;
 int silver;
 int bronze;
}Country;

typedef struct Tree_t
{
 struct Tree_t *left;
 struct Tree_t *right; 
 struct Tree_t *dad;
 Country* data; 
}Tree;

הבעיה נמצאת בשורה

compareTo(new->data->name,curr->data->name)

אז יש את ההודעת שגיאה שלעיל ואם אני מנסה להוסיף casting (לפני data ) מתקבלת הודעת שגיאה אחרת:parse error before `('

מה אפשר לעשות?

חזרה לתחילת העמוד הצג את כרטיס החבר של אורח אחר חפש הודעות אחרות של אורח אחר בקר בדף הבית של אורח אחר
 
צחי@
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 02 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 16 April 2007 בשעה 09:15 | IP רשוּם
ציטוט צחי@

אני לא רואה איך מה שעשית דומה במשהו למה שהצעתי. ב-Tree אין מצביע ל-*void.

אי אפשר לעזור לך ככה - יש לך שגיאות קומפילציה, סביר להניח תחביריות, אתה לא מצרף את הקוד המלא שלך ואף אחד לא אמור לנחש איך הקוד שלך נראה.

אז בתשובה לשאלתך - כנראה שאין מה לעשות ...
חזרה לתחילת העמוד הצג את כרטיס החבר של צחי@ חפש הודעות אחרות של צחי@ בקר בדף הבית של צחי@
 
yigael_o
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 25 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 30
נשלח בתאריך: 16 April 2007 בשעה 11:03 | IP רשוּם
ציטוט yigael_o

אתה בטוח ש new  לא מילה שמורה? אני יודע שעקרונית רק ב C++ ולא ב C אבל אולי תנסה לשנות למשהו סטנדרטי יותר?
חזרה לתחילת העמוד הצג את כרטיס החבר של yigael_o חפש הודעות אחרות של yigael_o
 
אורח אחר
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 16 April 2007 בשעה 14:01 | IP רשוּם
ציטוט אורח אחר

סליחה...התבלבלתי... הstruct של העץ הוא זה:

typedef struct Tree_t
{
 struct Tree_t *left;
 struct Tree_t *right; 
 struct Tree_t *dad;
 void* data; 
}Tree;

(פשוט שיניתי אחרי זה לא עבד...)

וכשאני מאתחל:

Tree *node;

Country *new; 

node->data=(void*)new;

אני מקווה שזה מספיק, כי אין לי מושג איך לצרף את כל הקוד

נ.ב

זה לא שגיאת תחביר כי כשהגדרתי country  במקום void עבד יופי

 

 

 

חזרה לתחילת העמוד הצג את כרטיס החבר של אורח אחר חפש הודעות אחרות של אורח אחר בקר בדף הבית של אורח אחר
 
צחי@
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 02 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 16 April 2007 בשעה 14:21 | IP רשוּם
ציטוט צחי@

קודם כל, אתה יכול לצרף קוד בתגיות [ CODE ] [ /CODE].

שנית, לא צירפת את הקוד שבו ניסית לעשות casting מ-*void ל-*Country.

סביר להניח שלא הוספת את ה-casting במקום הנכון, ככה:

קוד:

compareTo( ((Country*)new->data)->name,((Country*)curr->data)->name)

חזרה לתחילת העמוד הצג את כרטיס החבר של צחי@ חפש הודעות אחרות של צחי@ בקר בדף הבית של צחי@
 
אורח אחר
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 16 April 2007 בשעה 17:03 | IP רשוּם
ציטוט אורח אחר

זאת באמת היתה הבעיה...

תודה רבה על העזרה והסבלנות!

חזרה לתחילת העמוד הצג את כרטיס החבר של אורח אחר חפש הודעות אחרות של אורח אחר בקר בדף הבית של אורח אחר
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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