עבור לתוכן

לא מצליח לקמפל - שפת C

Featured Replies

פורסם

עכשיו תחפש בגוגל perror ותבין איך אמורים להשתמש בה, במקום לנחש איך משתמשים בה.

  • תגובות 47
  • צפיות 4.4k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

צודק סליחה טעות שלי... שיניתי כמו שצריך ומה שהוא אומר זה bad address

אני לא מבין למה.. הקבצים הרי כן נמצאים בתקיה.. :nixweiss:

פורסם
  • מחבר




#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 .

איפה לדעתך הבעיה? תודה שוב על הכל

פורסם

segmentation fault אומר שניסית לגשת לזכרון לא חוקי (כלומר יש לך מצביע לא תקני שאתה מנסה להשתמש בו, או שאתה חורג מגבולות של מערך). אני יכול להמליץ לך על אחד משלושה דברים:

1. להשתמש ב-valgrind, כלי שהמטרה שלו היא למצוא שגיאות זיכרון כאלה בדיוק.

2. להשתמש בדיבאגר (כמו gdb, או דיבאגר מובנה בסביבת פיתוח כמו eclipse) כדי לנסות לאתר את הבעיה.

3. להדפיס הדפסות עזר לאורך הקוד שלך ואז תראה איפה בדיוק הקריסה.

נ.ב. למה אתה עושה (1+argv)* במקום פשוט [1]argv?

פורסם
  • מחבר

אני חושב שהבעיה היא בעברה של הקובץ לפונקציה השניה... האם זאת הדרך? האם בכלל יש דרך?

פורסם

תסתכל על שני המקומות שבהם הגדרת את numberToLetter, ועל המקום שבו השתמשת בה, ותנסה להבין מה הבעיה.

(הקומפיילר לא נתן לך אזהרה על זה?)

פורסם
  • מחבר

הקומפיילר של הלינוקס לא, אבל של הויזואל סטודיו כן. תיקנתי אבל עדיין עושה

segmentation fault

שמתי לב שזה רשם בפלט דברים בג'יבריש וכל מני דברים לא ברורים אולי זה קשור?

פורסם

ודאי שזה קשור. הדפסות ג'יבריש קורות (בין השאר) כשאתה מנסה לגשת לזכרון לא תקני. הדבר האחר שיכול לקרות במצב כזה (ואכן קרה) הוא segmentation fault.

למה שלא תכתוב ותריץ הכל ב-VS ורק אחרי שהתכנית עובדת תעביר אותה ללינוקס? זה יעשה לך את החיים הרבה יותר קלים.

פורסם
  • מחבר

הוא מתקמפל ב VS רק נותן כמה ארורים שהוא מציע להשמתמש ב fopen_s ו fscan_s חוץ מזה הכל תקין

פורסם

תכנית מתקמפלת =! תכנית עובדת.

האם התכנית רצה לך על VS בלי בעיות?

פורסם
  • מחבר

no such file or directory

אני לא מבין למה? בדעתי 20 פעם שיש בתקיה שהקובץ רץ ממנו את הקבצים, גם ב VS וגם בלינוקס! :s05: :s05: :s05:

פורסם

שים לב שבלינוקס שמות הקבצים הם case sensitive. תוודא גם הרשאות בקובץ ושהקובץ אכן איפה שאמרת לו (תנסה לשלוח לפונקציה

נתיב אבסולוטי)

פורסם

ב-VS, כברירת מחדל, הוא מריץ את התוכנה מהתיקייה שבה יושב ה-exe, שהיא לא התיקייה של הפרוייקט שלך, אלא תיקייה בשם /bin/Debug (או משהו בסגנון) שיושבת תחת התיקייה של הפרוייקט. אחרי שאתה מקמפל, חפש איפה יושב ה-exe ושים שם את הקובץ שלך.

פורסם
  • מחבר

טוב שניתי את הקוד...

זה ככה:

אם המשתמש לא רשום כלום (רק מפעיל את הקובץ) זה נותן לו אופציה להכניס מספרים ואז הוא מדפיס את המספרים במילים כרגיל (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, עדיין אני מנסה את האפשרות הראשונה שהמתמש מכניס מספרים וזה מדפיס לו כרגיל. אך שאני מכניס מספר הוא פשוט לא עושה כלום... הוא יורד שורה וזהו...

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים