בעיה במחיקת מחסנית - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה במחיקת מחסנית


TheSlider

Recommended Posts

היי חברים,

יש לי בעיה בפונקציה שמוחקת את המחסנית.

כל התכנית טובה פרט לפונקציה שמוחקת את המחסנית.

אני שובר את הראש ולא עולה על הבעיה למה זה מוציא פלט ואז בסוף זורק אותי.

אשמח לעזרתכם :)

זה הקוד של הפונקציה הבעייתית:

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;

}

קישור לתוכן
שתף באתרים אחרים

קודם כל, תסביר לי למה ב-create_stack אתה עושה malloc ל-stack עצמו, במיוחד כשהסברתי לך בת'רד הקודם שלא צריך לעשות את זה.

יש לך באג ב-push - אם אתה מגדיל את גודל המחסנית, אז אתה לא דוחף את האיבר החדש.

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

קישור לתוכן
שתף באתרים אחרים

קודם כל, תסביר לי למה ב-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;

}

קישור לתוכן
שתף באתרים אחרים

בכלל לא התעלמתי, אז כנראה שאני לא מבין היכן הבעיה.. :nixweiss:

מה שנסיתי לעשות בstack push זה שאם נגמר המקום אז שהפונקציה תוסיף עוד מקום בנוסף למה שכבר קיים.

אחי, לא רוצה להיות חוצפן אבל תוכל בבקשה לתקן לי את השורה שתהיה נכונה?

ככה אוכל להבין איפה השגיאה שלי. ???

תודה רבה! :)

קישור לתוכן
שתף באתרים אחרים

קודם כל, בת'רד הקודם כבר אמרתי לך ש-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.

קישור לתוכן
שתף באתרים אחרים

אחי המון תודה!

אלה התיקונים מקווה שאחרונים

זו הפונקציה שיוצרת את המחסנית:

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;
}

זו הפונקציה push

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)));
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;

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

זה הmain

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;

}

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...