פורסם 2010 ביוני 815 שנים היי חברים, יש לי בעיה בפונקציה שמוחקת את המחסנית. כל התכנית טובה פרט לפונקציה שמוחקת את המחסנית. אני שובר את הראש ולא עולה על הבעיה למה זה מוציא פלט ואז בסוף זורק אותי. אשמח לעזרתכם זה הקוד של הפונקציה הבעייתית: void delete_stack(stack s){ free(s.items);} זה הקוד של כל התכנית #include <stdio.h>#include <stdlib.h>typedef struct stack_t{ int *items; int number_of_items; int max_size;}stack;stack create_stack(void){ stack *s = (stack*)malloc( sizeof(stack) ); if ( s == NULL ) exit(1); s->items=((int*) malloc(1 * sizeof(int))); if ( s->items == NULL ) { free(s->items); free(s); exit(1); } s->max_size=1; s->number_of_items=0; return *s;}void delete_stack(stack s){ free(s.items);}stack pop(stack *s,int *result){ if (s->number_of_items==0) *result=-1; else { *result=s->items[s->number_of_items-1]; s->number_of_items--; } return *s;}stack push(stack *s,int item){ if (s->number_of_items==s->max_size) { s->items= (int*) realloc(s->items, (s->max_size+1) * sizeof(int) ); } else { s->items[s->number_of_items]=item; s->number_of_items++; s->max_size++; } return *s;}int main(){ stack s; int num; s=create_stack(); s=push(&s,5); s=push(&s,4); s=pop(&s,&num); s=push(&s,4); s=pop(&s,&num); printf("%d\n",num); s=pop(&s,&num); printf("%d\n",num); s=pop(&s,&num); printf("%d\n",num); delete_stack(s); return 0;}
פורסם 2010 ביוני 915 שנים קודם כל, תסביר לי למה ב-create_stack אתה עושה malloc ל-stack עצמו, במיוחד כשהסברתי לך בת'רד הקודם שלא צריך לעשות את זה.יש לך באג ב-push - אם אתה מגדיל את גודל המחסנית, אז אתה לא דוחף את האיבר החדש.חוץ מזה, תחליט אם אתה עובד עם מצביעים או לא. אם אתה מקבל מצביע למחסנית כפרמטר, אז אין צורך גם להחזיר את המחסנית מהפונקציה.
פורסם 2010 ביוני 915 שנים מחבר קודם כל, תסביר לי למה ב-create_stack אתה עושה malloc ל-stack עצמו, במיוחד כשהסברתי לך בת'רד הקודם שלא צריך לעשות את זה.יש לך באג ב-push - אם אתה מגדיל את גודל המחסנית, אז אתה לא דוחף את האיבר החדש.חוץ מזה, תחליט אם אתה עובד עם מצביעים או לא. אם אתה מקבל מצביע למחסנית כפרמטר, אז אין צורך גם להחזיר את המחסנית מהפונקציה.תודה רבה על התשובה, הנה התקונים:זאת הפונקציה שיוצרת את המחסנית, מקווה שעכשיו היא בסדרstack create_stack(void){ stack *s = NULL; s=(stack*)malloc( sizeof(stack) ); if ( s == NULL ) exit(1); s->items=((int*) malloc(sizeof(int))); if ( s->items == NULL ) exit(1); s->max_size=1; s->number_of_items=0; *(s->items)=1; return *s;}זאת הפונקציה שדוחפת איברים למחסנית, משום מה אני לא יכול לקמפל אותהstack push(stack s,int item){ int maxsize; if (s.number_of_items==s.max_size) { s.items= (int*) realloc(s.items, (*(s.max_size)+1) * sizeof(int) ); } else { s.items[s.number_of_items]=item; s.number_of_items++; s.max_size++; } return s;}
פורסם 2010 ביוני 915 שנים קודם כל, התעלמת משני הדברים שאמרתי לך.חוץ מזה, אין לי מושג מה בכלל ניסית לעשות עם ה-(s.max_size)*, ולמה ציפית שדבר כזה יתקמפל.
פורסם 2010 ביוני 915 שנים מחבר בכלל לא התעלמתי, אז כנראה שאני לא מבין היכן הבעיה.. מה שנסיתי לעשות בstack push זה שאם נגמר המקום אז שהפונקציה תוסיף עוד מקום בנוסף למה שכבר קיים. אחי, לא רוצה להיות חוצפן אבל תוכל בבקשה לתקן לי את השורה שתהיה נכונה? ככה אוכל להבין איפה השגיאה שלי. ??? תודה רבה!
פורסם 2010 ביוני 915 שנים קודם כל, בת'רד הקודם כבר אמרתי לך ש-create_stack לא צריכה להקצות stack חדש, אלא פשוט להגדיר אותה מקומית. כלומר, במקום לעשות בלאגן כזה:stack* s = (stack*)malloc(sizeof(stack));אפשר פשוט לעשות:stack s;ואז כמובן להתייחס ל-s באופן מתאים (כ-stack ואל כ-*stack).הביטוי (s.max_size)* פשוט לא נכון - אתה מנסה להתייחס ל-int כאילו הוא מצביע. זה כנראה מה שגורם לשגיאת הקומפילציה (ולעתיד - תציין גם מה הודעת השגיאה, ואל תגיד סתם "זה לא מתקמפל").ב-push יש לך שני באגים: קודם כל, אם המערך מספיק גדול (כלומר נכנסים ל-else), אז אתה מכניס את האיבר במקום האחרון (שזה בסדר) אבל משום מה אתה מגדיל את max_size. אם המערך לא מספיק גדול (כלומר נכנסת ל-if ולא ל-else), אז אמנם אתה עושה realloc, אבל אתה לא עושה שום דבר עם המערך החדש - ואתה לא מוסיף את item לסוף המערך הזה, ואתה לא מגדיל את number_of_items ואת max_size.
פורסם 2010 ביוני 915 שנים מחבר אחי המון תודה!אלה התיקונים מקווה שאחרוניםזו הפונקציה שיוצרת את המחסנית:stack create_stack(void){ stack s; s.items=((int*) malloc(sizeof(int))); if ( s.items == NULL ) exit(1); s.max_size=1; s.number_of_items=0; s.items=1; return s;}זו הפונקציה pushstack push(stack s,int item){ int maxsize; if (s.number_of_items==s.max_size) { s.items= (int*) realloc(s.items, ((s.max_size+1) * sizeof(int))); s.items[s.number_of_items]=item; s.max_size++; s.number_of_items++; } else { s.items[s.number_of_items]=item; s.number_of_items++; } return s;אבל כרגע לאחר התיקונים שום דבר פתאום לא מופיע על המסך לאחר שאני מקמפל (בעוד שקודם כן זה עשה את המטרה רק בסוף זרק אותי מהתכנית).זה הmainint main(){ stack s; int num; s=create_stack(); s=push(s,5); s=push(s,4); s=pop(&s,&num); s=push(s,4); s=pop(&s,&num); printf("%d\n",num); s=pop(&s,&num); printf("%d\n",num); s=pop(&s,&num); printf("%d\n",num); delete_stack(s); return 0;}
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.