ABA


"בעיה בתוכנית בסי + קוד + הסבר התוכנית..."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #7819 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 7819
Hell-Boy

דרג אמינות חבר זה
   20:08   21.01.04   
אל הפורום  
  בעיה בתוכנית בסי + קוד + הסבר התוכנית...  
 
   ערכתי לאחרונה בתאריך 21.01.04 בשעה 20:19 בברכה, Hell-Boy
 
שלום.
אני מבצע תרגיל מתוך ספר שיש לי: ללמוד C מהדורה שלישית של הוד עמי.
אני נמצא בנושא הקצאת זיכרון דינמי..
התרגיל הוא:

כתוב תוכנית לניהול מערך של מספרים. הצג למשתמש תפריט על המסך בו יוכל לבצע את הפעולות הבאות:
* הוספת מספר למערך
* מחיקת מספר
* הדפסת כל המספרים

בתוכנית יש לנהל מערך דינמי של איברים מסוג int, ותמיד יש לשמור על זיכרון לא מבוזבז, כלומר גודל המערך יהיה תמיד זהה למספר האיברים שמאוחסנים בו.

לדוגמה:


Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
==>A
Add number: 30

Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
==>A
Add number: 50

Main menu: A.
Add new number.
D. Delete a number.
P. Print all numbers.
==>P
List of all numbers: 30,50,

Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
==>D
Enter number to delete: 34
Error: No such number...

וזה הקוד שכתבתי:


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int i=0;

void Check (char chr, int *ptr);

char Main_menu (char chr, int *ptr)
{
do {
printf("\n Main menu: \n A. Add new number. \n D. Delete a number. \n P. Print all numbers. \n E. Exit \n ==> ");
scanf("%c", &chr);
if (chr=='e' || chr=='E')
exit(0);
}
while (chr!='A' && chr!='a' && chr!='d' && chr!='D' && chr!='P' && chr!='p');
Check (chr, ptr);
return chr;
}

void Check (char chr, int *ptr)
{
int a, num;
if (chr=='A' || chr=='a')
{
i++;
printf("Add number: ");
scanf("%d", &num);
ptr = (int*)realloc(ptr, sizeof(int) * i);
ptr=num;
}

else if (chr=='D' || chr=='d')
{
printf("Enter number to delete: ");
scanf("%d", &num);
for (a=0 ; a<i ; a++)
{
if (ptr==num)
{
i--;
for ( ; a<i ; a++)
ptr==ptr;
ptr = (int*)realloc(ptr, sizeof(int) * i);
return;
}
if (a==i-1)
{
printf("Error: No such number...");
Main_menu;
}
}
}

else if (chr=='P' || chr=='p')
{
for (a=0 ; a<i ; a++)
printf("%d, ", ptr);
}
}

int main()
{
int *ptr;
char chr;
do {
chr = Main_menu(chr, ptr);
}
while (chr!='E' || chr!='e');
getchar();
}

עכשיו כשאני מקמפל אין שגיאות/ארורים... והתוכנית רצה...

אז אני מפעיל את התוכנית, ואז אני רואה את התפריט...
ואז אני מכניס 'a' והוא אומר לי Add number: ואני מכניס מספר, ואז הוא אומר לי: Segmentation fault
ויוצא מהתוכנית...
הנה:


$ guy

Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
E. Exit
==> a
Add number: 5
Segmentation fault
$

זה בעיה בהוספת מספרים (התו 'a'/'A')..

עכשיו כשאני רוצה למחוק מספר:


$ guy

Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
E. Exit
==> d
Enter number to delete: 5

Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
E. Exit
==>
Main menu:
A. Add new number.
D. Delete a number.
P. Print all numbers.
E. Exit
==>

ז"א אני מכניס לו שימחוק את המספר 5 ואז הוא מראה לי את התפריט פעמיים =\

כנ"ל עם p כדי שיציג את ערכי המערך...

והאפשרות היחידה שעובדת היא e כדי לצאת...

אז מה הבעיה בקוד עצמו?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  לאתחל משתנים חשבת? dryice 23.01.04 00:26 1

       
dryice

דרג אמינות חבר זה
   00:26   23.01.04   
אל הפורום  
  1. לאתחל משתנים חשבת?  
בתגובה להודעה מספר 0
 
   ptr=NULL;
למשל עשוי לגרום לדברים מעניינים לקרות(כמו למנוע מrealloc)
לעשות seg-fault.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net