שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 עכשיו תחפש בגוגל perror ותבין איך אמורים להשתמש בה, במקום לנחש איך משתמשים בה. קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 צודק סליחה טעות שלי... שיניתי כמו שצריך ומה שהוא אומר זה bad address אני לא מבין למה.. הקבצים הרי כן נמצאים בתקיה.. קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 אתה לא משתמש נכון ב-argc. קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 #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 .איפה לדעתך הבעיה? תודה שוב על הכל קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 segmentation fault אומר שניסית לגשת לזכרון לא חוקי (כלומר יש לך מצביע לא תקני שאתה מנסה להשתמש בו, או שאתה חורג מגבולות של מערך). אני יכול להמליץ לך על אחד משלושה דברים:1. להשתמש ב-valgrind, כלי שהמטרה שלו היא למצוא שגיאות זיכרון כאלה בדיוק.2. להשתמש בדיבאגר (כמו gdb, או דיבאגר מובנה בסביבת פיתוח כמו eclipse) כדי לנסות לאתר את הבעיה.3. להדפיס הדפסות עזר לאורך הקוד שלך ואז תראה איפה בדיוק הקריסה.נ.ב. למה אתה עושה (1+argv)* במקום פשוט [1]argv? קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 אני חושב שהבעיה היא בעברה של הקובץ לפונקציה השניה... האם זאת הדרך? האם בכלל יש דרך? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 תסתכל על שני המקומות שבהם הגדרת את numberToLetter, ועל המקום שבו השתמשת בה, ותנסה להבין מה הבעיה.(הקומפיילר לא נתן לך אזהרה על זה?) קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 הקומפיילר של הלינוקס לא, אבל של הויזואל סטודיו כן. תיקנתי אבל עדיין עושה segmentation faultשמתי לב שזה רשם בפלט דברים בג'יבריש וכל מני דברים לא ברורים אולי זה קשור? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 ודאי שזה קשור. הדפסות ג'יבריש קורות (בין השאר) כשאתה מנסה לגשת לזכרון לא תקני. הדבר האחר שיכול לקרות במצב כזה (ואכן קרה) הוא segmentation fault.למה שלא תכתוב ותריץ הכל ב-VS ורק אחרי שהתכנית עובדת תעביר אותה ללינוקס? זה יעשה לך את החיים הרבה יותר קלים. קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 הוא מתקמפל ב VS רק נותן כמה ארורים שהוא מציע להשמתמש ב fopen_s ו fscan_s חוץ מזה הכל תקין קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 תכנית מתקמפלת =! תכנית עובדת.האם התכנית רצה לך על VS בלי בעיות? קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 no such file or directoryאני לא מבין למה? בדעתי 20 פעם שיש בתקיה שהקובץ רץ ממנו את הקבצים, גם ב VS וגם בלינוקס! :s05: :s05: :s05: קישור לתוכן שתף באתרים אחרים More sharing options...
Gil28 פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 שים לב שבלינוקס שמות הקבצים הם case sensitive. תוודא גם הרשאות בקובץ ושהקובץ אכן איפה שאמרת לו (תנסה לשלוח לפונקציהנתיב אבסולוטי) קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 ביוני 18 Share פורסם 2012 ביוני 18 ב-VS, כברירת מחדל, הוא מריץ את התוכנה מהתיקייה שבה יושב ה-exe, שהיא לא התיקייה של הפרוייקט שלך, אלא תיקייה בשם /bin/Debug (או משהו בסגנון) שיושבת תחת התיקייה של הפרוייקט. אחרי שאתה מקמפל, חפש איפה יושב ה-exe ושים שם את הקובץ שלך. קישור לתוכן שתף באתרים אחרים More sharing options...
itai2k פורסם 2012 ביוני 18 מחבר Share פורסם 2012 ביוני 18 טוב שניתי את הקוד...זה ככה:אם המשתמש לא רשום כלום (רק מפעיל את הקובץ) זה נותן לו אופציה להכניס מספרים ואז הוא מדפיס את המספרים במילים כרגיל (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, עדיין אני מנסה את האפשרות הראשונה שהמתמש מכניס מספרים וזה מדפיס לו כרגיל. אך שאני מכניס מספר הוא פשוט לא עושה כלום... הוא יורד שורה וזהו... קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.