פורסם 2012 ביוני 1813 שנים עכשיו תחפש בגוגל perror ותבין איך אמורים להשתמש בה, במקום לנחש איך משתמשים בה.
פורסם 2012 ביוני 1813 שנים מחבר צודק סליחה טעות שלי... שיניתי כמו שצריך ומה שהוא אומר זה bad address אני לא מבין למה.. הקבצים הרי כן נמצאים בתקיה..
פורסם 2012 ביוני 1813 שנים מחבר #include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>int numberToLetter();int main(int argc, char *argv[]){ FILE *inputf, *outputf; int i=0; int numbers[100]={0}; if(argc > 3) /* more then 2 names */ { fprintf(stderr,"Eror! You cant enter more then 2 names.\n Goodbye!\n"); exit(0); } if(argc==1) /* no names */ { if(!(inputf=fopen("standardInput.txt","r"))) { perror("Cannot open standardInput file\n"); exit(0); } if(!(outputf=fopen("standardOutput.txt","w"))) { perror("Cannot open standardOutput file\n"); exit(0); } while(!feof(inputf)) /* put all the numbers from the input file to the arry */ { fscanf(inputf,"%d",&numbers[i]); i++; } } if(argc==2) /* if one name */ { if(!(inputf=fopen(*(argv+1),"r"))) { perror("Cannot open input file\n"); exit(0); } if(!(outputf=fopen("standardOutput.txt","w"))) { perror("Cannot open standardOutput file\n"); exit(0); } while(!feof(inputf)) /* put all the numbers from the input file to the arry */ { fscanf(inputf,"%d",&numbers[i]); i++; } } if(argc==3) /* if two names */ { if(!(inputf=fopen(*(argv+1),"r"))) { perror("Cannot open input file file\n"); exit(0); } if(!(outputf=fopen(*(argv+2),"w"))) { perror("Cannot open output file\n"); exit(0); } while(!feof(inputf)) /* put all the numbers from the input file to the arry */ { fscanf(inputf,"%d",&numbers[i]); i++; } } numberToLetter(numbers,outputf,inputf); fclose(inputf); fclose(outputf); return 0;}int numberToLetter(int numbers[],FILE *out){ int i=0,ahadot,asarot,num=0; char letters[100][20]; char firstWord[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"}; char tenPlus[10][10]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","seventeen","eighteen","nineteen"}; char secondWord[10][8]={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"}; while(!numbers[i]) { if(numbers[i]>0 && numbers[i]<11) /* if number between 0-10 */ { num=numbers[i]; strcpy(letters[i],firstWord[num]); } if(numbers[i]>10) { num=numbers[i]; ahadot=num%10; asarot=num/10; if(ahadot==0) strcpy(letters[i],tenPlus[asarot-1]); else scanf(letters[i],"%s" "%s",secondWord[asarot-1],firstWord[ahadot-1]); } i++; } i=0; while(letters[i]!=NULL) { fprintf(out,"%s",letters[i]); i++; }return 0;}זה הקוד הסופי (אחרי השינוי של ה argc), גם הוא מתקמפל. ועכשיו הוא אומר לי segmentation fault .איפה לדעתך הבעיה? תודה שוב על הכל
פורסם 2012 ביוני 1813 שנים segmentation fault אומר שניסית לגשת לזכרון לא חוקי (כלומר יש לך מצביע לא תקני שאתה מנסה להשתמש בו, או שאתה חורג מגבולות של מערך). אני יכול להמליץ לך על אחד משלושה דברים:1. להשתמש ב-valgrind, כלי שהמטרה שלו היא למצוא שגיאות זיכרון כאלה בדיוק.2. להשתמש בדיבאגר (כמו gdb, או דיבאגר מובנה בסביבת פיתוח כמו eclipse) כדי לנסות לאתר את הבעיה.3. להדפיס הדפסות עזר לאורך הקוד שלך ואז תראה איפה בדיוק הקריסה.נ.ב. למה אתה עושה (1+argv)* במקום פשוט [1]argv?
פורסם 2012 ביוני 1813 שנים מחבר אני חושב שהבעיה היא בעברה של הקובץ לפונקציה השניה... האם זאת הדרך? האם בכלל יש דרך?
פורסם 2012 ביוני 1813 שנים תסתכל על שני המקומות שבהם הגדרת את numberToLetter, ועל המקום שבו השתמשת בה, ותנסה להבין מה הבעיה.(הקומפיילר לא נתן לך אזהרה על זה?)
פורסם 2012 ביוני 1813 שנים מחבר הקומפיילר של הלינוקס לא, אבל של הויזואל סטודיו כן. תיקנתי אבל עדיין עושה segmentation faultשמתי לב שזה רשם בפלט דברים בג'יבריש וכל מני דברים לא ברורים אולי זה קשור?
פורסם 2012 ביוני 1813 שנים ודאי שזה קשור. הדפסות ג'יבריש קורות (בין השאר) כשאתה מנסה לגשת לזכרון לא תקני. הדבר האחר שיכול לקרות במצב כזה (ואכן קרה) הוא segmentation fault.למה שלא תכתוב ותריץ הכל ב-VS ורק אחרי שהתכנית עובדת תעביר אותה ללינוקס? זה יעשה לך את החיים הרבה יותר קלים.
פורסם 2012 ביוני 1813 שנים מחבר הוא מתקמפל ב VS רק נותן כמה ארורים שהוא מציע להשמתמש ב fopen_s ו fscan_s חוץ מזה הכל תקין
פורסם 2012 ביוני 1813 שנים מחבר no such file or directoryאני לא מבין למה? בדעתי 20 פעם שיש בתקיה שהקובץ רץ ממנו את הקבצים, גם ב VS וגם בלינוקס! :s05: :s05: :s05:
פורסם 2012 ביוני 1813 שנים שים לב שבלינוקס שמות הקבצים הם case sensitive. תוודא גם הרשאות בקובץ ושהקובץ אכן איפה שאמרת לו (תנסה לשלוח לפונקציהנתיב אבסולוטי)
פורסם 2012 ביוני 1813 שנים ב-VS, כברירת מחדל, הוא מריץ את התוכנה מהתיקייה שבה יושב ה-exe, שהיא לא התיקייה של הפרוייקט שלך, אלא תיקייה בשם /bin/Debug (או משהו בסגנון) שיושבת תחת התיקייה של הפרוייקט. אחרי שאתה מקמפל, חפש איפה יושב ה-exe ושים שם את הקובץ שלך.
פורסם 2012 ביוני 1813 שנים מחבר טוב שניתי את הקוד...זה ככה:אם המשתמש לא רשום כלום (רק מפעיל את הקובץ) זה נותן לו אופציה להכניס מספרים ואז הוא מדפיס את המספרים במילים כרגיל (printf)אם הוא רושם שם אחד - הקובץ הזה יהיה קלט של מספרים וידפיס אותם רגיל (printf)אם הוא רושם שני שמות הקובץ הראשון הוא קלט והקובץ השני הוא פלט.זה הקוד:#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>int numberToLetter(int numbers[],FILE *out);int numberToLetters(int numbers[]);int main(int argc, char *argv[]){ FILE *inputf, *outputf; int i=0,num=0; char line[100]={0}; char *temp; int numbers[100]={0}; if(argc > 3) /* more then 2 names */ { fprintf(stderr,"Eror! You cant enter more then 2 names.\n Goodbye!\n"); exit(0); } if(argc==1) /* no names */ { printf("please enter numbers between 0-99:\n"); gets(line); temp = strtok(line," "); while(temp!=NULL) { temp = strtok(line," "); num=atoi(temp); numbers[i]=num; i++; } numberToLetters(numbers); } if(argc==2) /* if one name */ { if(!(inputf=fopen(argv[1],"r"))) { perror("Cannot open input file\n"); exit(0); } while(!feof(inputf)) /* put all the numbers from the input file to the arry */ { fscanf(inputf,"%d",&numbers[i]); i++; } numberToLetters(numbers); } if(argc==3) /* if two names */ { if(!(inputf=fopen(argv[1],"r"))) { perror("Cannot open input file file\n"); exit(0); } if(!(outputf=fopen(argv[2],"w"))) { perror("Cannot open output file\n"); exit(0); } while(!feof(inputf)) /* put all the numbers from the input file to the arry */ { fscanf(inputf,"%d",&numbers[i]); i++; } numberToLetter(numbers,outputf); fclose(inputf); fclose(outputf); } return 0;}int numberToLetter(int numbers[],FILE *out){ int i=0,ahadot,asarot,num=0; char letters[100][20]; char firstWord[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"}; char tenPlus[10][10]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","seventeen","eighteen","nineteen"}; char secondWord[10][8]={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"}; char word; while(!numbers[i]) { if(numbers[i]>0 && numbers[i]<11) /* if number between 0-10 */ { num=numbers[i]; strcpy(letters[i],firstWord[num]); } if(numbers[i]>10) { num=numbers[i]; ahadot=num%10; asarot=num/10; if(ahadot==0) strcpy(letters[i],tenPlus[asarot-1]); else scanf(letters[i],"%s" "%s",secondWord[asarot-1],firstWord[ahadot-1]); } i++; } i=0; while(letters[i]!=NULL) { fprintf(out,"%s",letters[i]); i++; }return 0;}int numberToLetters(int numbers[]){ int i=0,ahadot,asarot,num=0; char word; char letters[100][20]; char firstWord[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"}; char tenPlus[10][10]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","seventeen","eighteen","nineteen"}; char secondWord[10][8]={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"}; while(!numbers[i]) { if(numbers[i]>0 && numbers[i]<11) /* if number between 0-10 */ { num=numbers[i]; strcpy(letters[i],firstWord[num]); } if(numbers[i]>10) { num=numbers[i]; ahadot=num%10; asarot=num/10; if(ahadot==0) strcpy(letters[i],tenPlus[asarot-1]); else scanf(letters[i],"%s" "%s",secondWord[asarot-1],firstWord[ahadot-1]); } i++; } i=0; while(letters[i]!=NULL) { scanf(letters[i],"%s",&word); printf("%s",word); i++; }return 0;}הקובץ מתקמפל ב VS, עדיין אני מנסה את האפשרות הראשונה שהמתמש מכניס מספרים וזה מדפיס לו כרגיל. אך שאני מכניס מספר הוא פשוט לא עושה כלום... הוא יורד שורה וזהו...
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.