פורסם 2004 בספטמבר 2121 שנים אני מנסה לעשות מיון של שםכלומר שיסדר לי את סטראקט ע"פ שםאז בניתי את הפונקציה הזו:void sort(worker w[]){worker temp;for (int i=0 ; i<worker_num; i++) { for (int j=0 ; !w.last[j++] ; j++) { if ((strcmp(w.last[j],w[i++].last[j]))<0) { temp=w; w=w[i++]; w[i++]=temp; } } }}מה שהתברר כלא מוצלח במיוחדיש לי שגיאות של הקומפיילר שאני לא יכול להמיר INT ל char*???last מוגדר כ -------------------------------------------------------------------------> char last[21];
פורסם 2004 בספטמבר 2121 שנים מעבר לעובדה שלא ציינת איך worker מוגדר, ברור גם שכל ה ++i שלך גורמים לשגיאות.הפקודה ++i מוסיפה ל i אחד וגם משאירה אותו כך אח"כ. אין לי ספק שמה שכתבת אינו מה שרצית. כפי שכתבת את הלולאה אתה מקדם את i חמש!!!!! פעמים בכל איטרציה.
פורסם 2004 בספטמבר 2221 שנים מחבר #define n 21#define worker_num 2typedef struct{char last[n];char name[n];int gil;int vetek;char rank[10];int sal;int holiday[12];int sum;}worker;איך אני אמור להישתמש ב I ?התוכנית גם לא מצליחה לרוץ, היא רושמת את השיגאת קומפילציה שציינתי בהודעה הראשונה,אני חושב שהבעיה היא בשימוש שלי עם הפונקציה בשורה הזו:if ((strcmp(w.last[j],w[i++].last[j]))<0)
פורסם 2004 בספטמבר 2221 שנים אני כרגע לא מתייחס לאם התוכנית עושה מה שאתה רוצה, אלה רק לשגיאת קומפלציההבעיה שלך בשורת ה-if היא שהפונקציה strcmp מקבלת שני מחזורות, כלומר משתנים מטיפוס char*w הוא מטיפוס worker*w הוא מטיפוס workerw.last הוא מטיפוס char*w.last הוא מטיפוס charכמו שאתה רואה אתה מעביר לפונקציה משתנה מטיפוס char במקום char*
פורסם 2004 בספטמבר 2221 שנים מחבר מה שאני מנסה לעשות זה למיין את last לפי השם, כלומר שהוא ימיין את מערך הסטראקטים ע"פ השם משפחהאז איך אני צריך לעשות את זה אם w.last הוא מטיפוס char?
פורסם 2004 בספטמבר 2221 שנים STRCMP לא טוב להשוואת תווים בודדים לשם כך יותר מומלץ לעשות השוואה על ערכי ה-ASCII של התווים לדוגמא להשוואת ch,ch2תרשום:( (if( int(ch) > int(ch2
פורסם 2004 בספטמבר 2221 שנים הוא לא רוצה להשוות בין תווים, אלא בין מחרוזות שלמות.void sort(worker w[]){worker *temp; int i,j;for (i=0 ; i<worker_num; i++) { for (j=0 ; j<worker_num ; j++) { if ( (strcmp(w.last, w[i+1].last)) < 0) { temp=w; w=w[i+1]; w[i+1=temp; } } }}
פורסם 2004 בספטמבר 2221 שנים מחבר זה עובר את הקומפיילר אבל התוכנית לא ממיינת לי את מערך הסטראקטים... :-\
פורסם 2004 בספטמבר 2221 שנים void sort(worker w[]){worker temp; int i,j;for (i=0 ; i<worker_num; i++) { for (j=i ; j<worker_num ; j++) { if ( (strcmp(w.last, w[j].last)) < 0) { temp=w; w=w[j]; w[j]=temp; } } }}לאט לאט הפורום הזה נהיה פורום שעורי בית
פורסם 2004 בספטמבר 2221 שנים מחבר עבדתי על זה עוד כמה שעות רק בשביל להבין שהסמן בשורה if ( (strcmp(w.last, w[j].last)) < 0) היה צריך להיות בכיוון השני , ככה: if ( (strcmp(w.last, w[j].last)) > 0) ואז זה עבד סוף סוף!!! 8) "הלב אומר תודה"
פורסם 2004 בספטמבר 2221 שנים אפשר להשוות (השמה) בכזו צורה בין מבנים?worker1 = worker2 ?לא ידעתי.בפתרון שלי התכוונתי להחליף את הכתובות ובגלל זה הגדרתי את temp כמצביע.אבל אם זה עובד גם ככה - אז יופי.
פורסם 2004 בספטמבר 2621 שנים זה עובד טוב כל עוד בSTRUCT עצמו אין מצביעים שאתה מתכוון לשנות אותם אחרכךכי אם אתה משנה אחרכך אז זה משנה בשניהםאני לא זוכר איך קוראים להשמה הזו
פורסם 2004 בספטמבר 2821 שנים אתה עובד עם ++C או C?כי אם זה C אז אני לא חושב שזו השמה סטנדרטית, עפ"י ANSI. לדעתי הקומפיילר פשוט מתייחס אליהם בתור אובייקטים (אפילו אם זה מקומפל בתור C, הקומפיילר אולי לוקח את אחת התכונות של CPP לשם ההשמה) וההשמה היא האופרטור הברירת מחדל למחלקות (העתקת כל משתני המחלקה למחלקה השניה).לפחות כך אני סבור שזה עובד. בכל מקרה בחיים לא ראיתי שמותר לעשות השמה בין שני struct ב- C (לא ++).תבדוק אם יש לך אזהרות מצד הקומפיילר לגבי ההשמה הזו.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.