02-01-2012, 14:10
|
|
|
|
חבר מתאריך: 14.12.09
הודעות: 9,751
|
|
לא. זה לא מה שכתבת. אתה כתבת משהו אחר, וזה נראה כאילו לא קראת או התעלמת ממה שאני ו-NARXX כתבנו לך למעלה. קודם כל, בחלק הזה יש באג:
ציטוט:
במקור נכתב על ידי Army_Boy
קוד:
slist* add_student(slist *students, char *name, int id) {
student* head;
if (!( head = (student*)malloc(sizeof(student)))) exit (1);
head->id = id;
head->name = name;
|
כמובן ש-NARXX הסביר למעלה מה אתה צריך לעשות, ואפילו כתב קוד לדוגמה:
ציטוט:
במקור נכתב על ידי Narxx
במצב הזה, אתה לא יכול פשוט להעתיק עם strcpy, כיוון שאין לך מחרוזת אלא רק מצביע. אתה צריך קודם לכן להקצות מקום למחרוזת ורק אח"כ להעתיק.
איך עושים?
נניח שיש לך buffer כלשהו שאתה סורק אליו, ולצורך הפשטות, נניח שאתה משתמש ב scanf (אם אתה משתמש בפונקציה אחרת, פשוט זרום עם הדוגמא שלי ותשנה אצלך בקוד למה שזה לא יהיה).
קוד PHP:
char buffer[255]; /* scan details */ printf("enter a name\n"); scnaf("%s", buffer);
/* create a new student */ struct Student* student = (struct Student*) malloc (sizeof(struct Student));
/* create a new string for student's name */ student.name = (char*) malloc (sizeof(char) * strlen (buffer));
/* copy the name from buffer into student.name */ strcpy (student.name , buffer);
|
מה שאתה עשית אומר שהמצביע שאמור להצביע לשם של הסטודנט החדש שיצרת, מצביע למחרוזת שהעבירו לך לפונקציה. אבל אחרי שנגמרת הפונקציה, יכול להיות שהזיכרון שאליו אתה מצביע נעלם. בגלל זה אתה צריך להקצות זיכרון משלך ולהעתיק לשם את השם של הסטודנט. כמו ש-NARXX גם הסביר וגם כתב בקוד שלו...
לדוגמה:
קוד:
void f() {
char buf[255];
printf("Enter name: ");
fgets(buf, sizeof(buf));
slist* students = getFromSomewhere();
add_student(students, buf, 123);
}
void g() {
f();
}
הקוד שלך יגיע שהמצביע בסטודנט החדש שיצרת מצביע ל-buf, אבל ברגע שחוזרים מהפונקציה f לפונקציה g, המשתנה buf נעלם. מושמד. אתה חייב להקצות זיכרון משלך בשביל השם. כמו שהסבירו לך. כמו שעשו בקוד שנתנו לך.
הבאג השני שלך הוא שבמקום להוסיף את הסטודנט לרשימה שנתנו לך, אתה זורק את הרשימה לעזאזל, ויוצר רשימה חדשה:
ציטוט:
במקור נכתב על ידי Army_Boy
קוד:
if (!( students = (slist*)malloc(sizeof(slist)))) exit (1);
students->info = head ;
students->next = NULL ;
return students; }
|
כאילו, על מה חשבת כשעשית את זה?
נותנים לך את הפרמטר students, ואז אתה מתעלם ממה שיש בו, ודורס אותו עם ערך חדש משלך.
אז למה קיבלת את הפרמטר הזה בכלל?
כמובן שכתבתי למעלה מה היית אמור לעשות, אבל כמו במקרה עם NARXX, או שלא קראת או שהתעלמת.
ציטוט:
במקור נכתב על ידי פסטן
והוא צריך גם לייצר slist חדש, ולהוסיף אותו לרשימה. אחרי שיצרנו את הסטודנט שעשית למעלה, צריך:
קוד:
slist * slist_student = malloc(sizeof(slist));
slist_student.info=student;
slist_student.next=NULL;
for (slist*cur=students; cur.next!=NULL || cur.next=slist_student; cur=cur.next);
לכבוד השנה החדשה כתבתי קוד מזעזע במיוחד.
|
_____________________________________
(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס
אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
|