פורסם 2007 בדצמבר 517 שנים שלומות! =]אני עובד על תוכנה שאמורה לקרוא משפט, לזהות אם יש בו calc ואז לחשב את המספרים אחרי.לדוגמא קלט-calc 4+3 פלט-7להלן הפונקציה הלא גמורה שלי(עוד לא בדקתי מקרה של קלט לא תקין ) שלא מתקמפלת בגלל הבעיה unterminated character constant.אך אינני יודע למה ישנה הבעיה מכיוון שבדקתי את הפונקציה ולא מצאתי את הבעיה =\.עזרה למצוא את בעיית הקימפול יהיה נחמד =] תודה רבה. להלן הפונקציה:#include <stdio.h>#include <string.h>int function_calc(char str[200],int i);int main(){ char str[200]; gets(str); if(str[0]=='c' && str[1]=='a' && str[2]=='l' && str[3]=='c') { puts("calc"); function_calc(char str[200],int i); }}int function_calc(char str[200],int i){ char ch,plus,diving,subtract,multi,square,hadError; int i; double num,sum; for(i=5;i<200;i++) { ch=str[i]; if(ch>='0' && ch<='9') { if(plus=='y') num=num+ch-48; else if(diving=='y') num=num/(double)(ch-48); else if(subtract=='y') num=num-ch-48; else if(multi=='y') num=num*(ch-48); else if(square=='y') num=num+(ch-48); else num=ch-48; } else { switch(ch) { case '+':plus='y';break; case '\':diving='y';break; case '-':subtract='y';break; case '*':multi='y';break; case '^':square='y';break; default:hadError='y';break; } } }}
פורסם 2007 בדצמבר 517 שנים קודם כל, בד"כ הקומפיילר אומר לך באיזו שורה הבעיה.חוץ מזה, הגדרת את הפונקציה function_calc כך שהיא לא מקבלת פרמטרים בכלל.(יש לך עוד באגים אחרים, אבל קודם כל נביא את התכנית למצב שהיא מתקמפלת)
פורסם 2007 בדצמבר 517 שנים מחבר קודם כל, בד"כ הקומפיילר אומר לך באיזו שורה הבעיה.חוץ מזה, הגדרת את הפונקציה function_calc כך שהיא לא מקבלת פרמטרים בכלל.(יש לך עוד באגים אחרים, אבל קודם כל נביא את התכנית למצב שהיא מתקמפלת)למה אתה מתכוון בכך שהיא לא מקבלת פרמטרים? האם אני צריך להגידר אותה כ function_calc(char string[200],int i)?עריכה- ערכתי תיקנתי כמה דברים .
פורסם 2007 בדצמבר 517 שנים מחבר כן, בדיוק ככה.ואז כמובן תדאג שהפונקציה תשתמש בפרמטרים האלה.אז בכל פרמרטים ומשתנה שאני משתמש בפונקציה אני צריך לכתוב אותו בהצרה? אתה יכול להסביר בקצרה על זה?
פורסם 2007 בדצמבר 517 שנים אתה צריך לכתוב בהצהרה ובהגדרה של הפונקציה את רשימת הפרטמרים שהפונקציה מקבלת (בהצהרה אתה לא חייב לציין את השמות של המשתנים אלא יכול רק את הטיפוסים שלהם אבל בהגדרה של הפונקציה אתה חייב לציין גם את השמות).אם ההצהרה נראית כך:int function_calc(char string[200],int i)אז גם ההגדרה (איפה שמופיע גוף הפונקציה) צריכה להיות זהה.
פורסם 2007 בדצמבר 617 שנים כשאתה קורא לפונקציה, אתה צריך לקרוא לה רק עם השמות של המשתנים שאתה מעביר, ולא עם הטיפוסים שלהם.ככה:function_calc(str, i);עשה טובה, תקרא שוב על פונקציות ואיך משתמשים בהן.
פורסם 2007 בדצמבר 617 שנים כמה דברים:- אתה גם לא צריך להגדיר את i כפרמטר שהפונקציה מקבלת הרי אתה מגדיר אותו שוב בתוך הפונקציה והוא לא משתנה שצריך לקבל ערך ממי שקורא לפונקציה. i גם לא קיים ב main ככה שאתה לא יכול לשלוח את i ל function_calc (הוא לא קיים ב main, אין קשר בין השם של הפרמטר לערך שהוא מקבל ממי שקורא לפונקציה).- ב case עם ה '\' אתה צריך לכתוב '\\' כי \ משמש לתווי בקרה (כמו \n ו- \t) אז כשרוצים להשתמש בתו עצמו צריך להשתמש ב \\.- עוד בעיה: כשאתה קולט מספר אתה ישר בודק את המשתנים שמציינים את הפעולות, אבל כשאתה קולט את המס' הראשון אף אחד מהם לא מאותחל ואתה תקבל שגיאה. אתה צריך לאתחל את כולם (עם 'n' למשל). עריכה: שמתי לב שאתה גם לא עושה כלום עם התוצאה של החישוב. לפי ה int שמחזירה הפונקציה אולי רצית להחזיר את הערך (כדי לעשות את זה אתה משתמש ב return) או שאולי אתה רוצה להדפיס את התוצאה מתוך הפונקציה.
פורסם 2007 בדצמבר 617 שנים מחבר תודה על הביקורת הבונה. ערכתי קצת את הפונקציה כמו שצריך אך עדין יש לי בעיה עם הפונקציה, למרות התיקון#include <stdio.h>#include <string.h>#define SIZE 200int function_calc(char [],int);int main(){ char str[SIZE]; gets(str); if(str[0]=='c' && str[1]=='a' && str[2]=='l' && str[3]=='c') { puts("calc"); function_calc(str,SIZE); }}int function_calc(char str[],int SIZE){ char ch,plus='n',diving='n',subtract='n',multi='n',square='n',hadError='n'; double num=0,sum=0; int i,j; for(i=5;i!='\0';i++) { ch=str[i]; if(ch>='0' && ch<='9') { if(plus=='y') num=num+ch-48; else if(diving=='y') num=num/(double)(ch-48); else if(subtract=='y') num=num-ch-48; else if(multi=='y') num=num*(ch-48); else if(square=='y') { for(j=1;j<ch;j++) { num=num*(num); } } else num+=ch-48; sum+=num; } else { if(ch=='+') plus='y'; else if(ch=='\\') diving='y'; else if(ch=='-') subtract='y'; num=num-ch-48; else if(multi=='y') num=num*(ch-48); else if(square=='y') { for(j=1;j<ch;j++) { num=num*(num); } } else num+=ch-48; sum+=num; } else { if(ch=='+') plus='y'; else if(ch=='\\') diving='y'; else if(ch=='-') subtract='y'; else if(ch=='*') multi='y'; else if(ch=='^') square='y'; else if(ch=='\n') printf("%.1lf",sum); else hadError='y'; } }}בהצהרה- אני כותב את סוג המשתנים.ובהגדרה את השם שלהם והסוג כמו שעשיתי.אך אני נתקל בבעיות הנ"ל:main.c:16: parse error before `200'main.c: In function `function_calc':main.c:17: number of arguments doesn't match prototypemain.c:5: prototype declarationmain.c:23: `str' undeclared (first use in this function)main.c:23: (Each undeclared identifier is reported only oncemain.c:23: for each function it appears in.)אני לא מבין למה הוא אומר שהוא הצהרתי את str, הרי הגדרתי אותו בMAIN והעברתי אותו כארגונמט לפונקציה function_calc, ואותו דבר לבעיות האחרות, הרי הגדרתי אותם 2 ארגומנטים לכל הפונקציה הזאת.נ.ב זה קימפל לי תפונקציה שהשתמש ב200 ללא DEFINE אך זה השיב לי בsegment fault שזה ERROR חמור אז החלטתי להשתמש בDEFINE.שאני מגיע לסוף שורה אז הוא מתדפיס את הסכום של המספרים.
פורסם 2007 בדצמבר 617 שנים כשאתה משתמש ב #define בכל פעם שמופיע השם של מה שהגדרת הוא מוחלף (ע"י ה preprocessor) בערך שהגדרת. מה שאומר שהשורה:int function_calc(char str[],int SIZE)מתורגמת ל:int function_calc(char str[],int 200)מה שמין הסתם לא חוקי. אין לך צורך במפרמטר נוסף, אתה הרי רץ עד לתו ריק (/0).לגבי הפונקציה קצת הסתבכת שם. הפונקציה אמורה לחשב רק פעולה אחת (כמו למשל 1+2) או כמה (כמו 1+2+3)?לגבי הלולאה, התנאי שלך אמור להיות str[ i ] != '\0' ולא i!='\0' כי אתה רוצה לבדוק את התו שבמקום ה i ולא את i.
פורסם 2007 בדצמבר 617 שנים מחבר אוקי צודק בקשר לתנאי לולאה, קצת פישלתי שם. בקשר להגדרה הבנתי את הטעות אבל לא הבנתי איך זה עוזר לתקן את הבעית קומלפציה כי היא נשארת אחרי התיקון, אני לא מבין בכלל למה הבעית קומפילציה מופיע שם הגדרתי את הפונקציה כמו שצריך לפי דעתי. לגבי הפונקציה אני רוצה שזה יפתור כל מיני מקרים כמו 3+4-8 או 3+4-7+5+4-5 בנתיים השארי את החזקות הכפל והחילוק שמה אבל לא השתמשתי בהם כי אני חושב על איך לסדר את זה שזה יפעל לפי סדר מתמטי (חזקה קודם אחרכך כפל ואחר כך חיבור וכו') בנתיים אני עובד על החיבור והחיסור. תודה.
פורסם 2007 בדצמבר 617 שנים אם אתה רוצה להוסיף גם כפל וחילוק(כחלק מביטוי ארוך יותר), כדאי לך לתכנן איך תעשה את זה, ואחר כך תתחיל לכתוב.
פורסם 2007 בדצמבר 717 שנים מחבר אין לי בנתיים רעיון לכפל והחילוק ולכן ביקשתי עזרה רק עם החיבור והחיסור =\
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.