ערכתי לאחרונה בתאריך 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 כדי לצאת...
אז מה הבעיה בקוד עצמו?