פורסם 2010 בספטמבר 615 שנים שלום חברים. מה שיש בקוד לא משנה (את הקוד קיבלתי פחות או יותר כמו שהוא לתרגיל בית) מה שבמודגש כרגע הם הדברים הרלוונטיים. סך הכל מה שאני מנסה לעשות הוא להעתיק מחרוזת הנקלטת ע"י המשתמש לתוך מחרוזת הנמצאת בתוך STRUCT הנקרא PIC אבל משום מה כל נסיונותיי להעתיק את המחרוזת המתקבלת ע"י המשתמש למחרוזת ב STRUCT כושלים בהודעת קריסה תוך כדי התכנית. רוב הדברים שיש בקוד הם רק לבדיקה והרבה דברים מיורקים כי הם לא חשובים כרגע, אבל אם מישהו יוכל להגיד לי את הסיבה (סביר להניח האידיוטית) למה הוא קורס אני אודה לו מאד!!!! להלן הקוד הבא: #include <conio.h>#include <string.h>#pragma warning (disable : 4996)#define SIZE 256///The Structs///Creating the Picture[b]typedef struct picture{ int height; int width; char* data;} PICTURE;////[/b]///Sequence to help compressingtypedef struct sequence{ char c; int times;} SEQUENCE;//////Compresstypedef struct compressed_pic{ int height; int width; SEQUENCE* data;} COMPRESSED_PIC;//////End of the Structs///Functions headerCOMPRESSED_PIC CompressPicture(PICTURE p);///End of headersvoid main(){ int exit=1;//flag for exit int OP;//The operation for switch ///veriables for case 1: int i,j; [b]PICTURE PIC={0,0,"abcdefg"};///the name of struct in main[/b] c[b]har tempstr[SIZE];///temp string for PIC.data veriable[/b] ///end of veriables for case 1 while(exit)//for the user to be able to exit the prog { do { printf("\n\t *** MENU *** \n"); printf("\nPress 1 to draw picture\n"); printf("\nPress 2 to read picture\n"); printf("\nPress 3 to save picture\n"); printf("\nPress 4 to compress picture\n"); printf("\nTo EXIT press 0\n\n"); scanf("%d",&OP); }while(OP!=1 && OP!=2 && OP!=3 && OP!=4 && OP!=0);//to continue the menu showing switch(OP) {[b] ///Creating the picture case 1: { printf("\n***Creating the picture: ***\n"); printf("\nPlease enter the width of the picture: "); scanf("%d",&PIC.width); printf("\nPlease enter the height of the picture: "); scanf("%d",&PIC.height); printf("\nEnter the picture data line by line:\n"); for(i=0 ; i<PIC.height ;i++) { printf("\nline %d: ",i+1); for(j=0 ; j<PIC.width ; j++) { tempstr[j]=getche();///get the chars by length with enter } tempstr[j]='\0';///need to know when to finish the string printf("\n%s\n",tempstr);///for check only printf("\n%s\n",PIC.data); //if(i==0)///for the first time only strcpy(PIC.data,tempstr); //if(i!=0)///for every other then first time //strcat(PIC.data,tempstr); printf("\n%s\n",PIC.data);[/b] } break; } /// End of Creating the picture case 2: { break; } case 3: { break; } case 4: { break; } case 0: { exit=0; printf("\n Good bye!\n\n"); break; } }///end of switch }///end of while}///End of main #include <stdio.h> תודה מראש עריכה: אגב למי שאין כוח להסתכל בכל הקוד (אני יודע שלי לא היה במקומכם) זו השורה שגורמת לקומפיילר לקרוס תוך כדי התכנית strcpy(PIC.data,tempstr);
פורסם 2010 בספטמבר 615 שנים טוב, אז אתה כמה פעמים עצלן1) כמו שראית, ההדגשות שלך לא עובדות בתוך התגיות של code אבל לא הסרת אותן. (אבל סחטיין על הנסיון).2) גם על פי הודאה שלך 3) לא התחשק לך לאתחל את PIC.data4) כדאי לצרף את הודעת השגיאה הצפציפיתדע לך כי למעשה התוכנית יכלה להתעצל ולהחליט שבא לה לנוח כבר בהוראהprintf("\n%s\n",PIC.data)אתה פונה לכתובת לא מאותחלת.הפתרון הוא כמובן לא לתכנת ואז לא יהיו לך כל הבעיות המטרידות והמעיפות האלו.ד"א במיוחד אהבתי את ההערה הבאה בקודchar tempstr[SIZE];///temp string for PIC.data veriableשים לב וזה חשוב: ההערות שתכתוב לעולם לא יגרמו למחשב לעשות מה שאתה רוצה. אך ורק הקוד שתכתוב יכול להשיג את המטרה. (או במילים אחרות, יכולתי לכתוב בהערה שאני מלכת אנגליה וזה היה נכון באותה המידה. או במילים אחרות אחרות אין קשר בין ההערה שכתבת למה שקורה בתוכנית)אני מתנצל במלרע על הסרקזם. שיהיה בהצלחה!
פורסם 2010 בספטמבר 1015 שנים nsofi צדק בזה שלא אתחלת את PIC.data.יש 2 אפשרויות:1) הקצאה דינאמית - אתה צריך למצוא את הגודל את tempstr, (נניח שהוא יהיה ב-PIC.width * PIC.hright ), ואז להקצות לפיו ע"י PIC.data = (char *)malloc(PIC.height * PIC.width + 1);רק שים לב שבשיטה הזו תצטרך לעשות free בסוף התוכנית (או כשתסיים עם התמונה הזו).2) להקצות את המערך סטטית (ע"י נתינת אורך מקסימאלי שהתמונה תוכל איי פעם לקבל) בשורת ההגדרה של הSTRUCT.ד.א. יש מצב שה- data לא אמור להכיל בכלל טקסט אלא נתונים בינארים? אם כן תצטרך לשנות קצת את הקוד שלך.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.