פורסם 2009 במאי 916 שנים בעייה חדשה בהודעה אחרונה שלום אנשים אני עובד בVC++ 2008 עשיתי פונקציה שמקבלת כפרמטר ifstream f ניסיתי לעשות בתוך הפונקציה f.getline(Cmd,51); (CMD זה מערך של 51 תווים) השגיאה: 1>c:\program files\microsoft visual studio 9.0\vc\include\fstream(676) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'1> with1> [1> _Elem=char,1> _Traits=std::char_traits<char>1> ]1> c:\program files\microsoft visual studio 9.0\vc\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'1> with1> [1> _Elem=char,1> _Traits=std::char_traits<char>1> ]1> This diagnostic occurred in the compiler generated function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'1> with1> [1> _Elem=char,1> _Traits=std::char_traits<char>1> ] אני לא מבין מה זה אמור להביע ולמה זה לא עובד, הסתכלתי על כל מיני קודים לדוגמה וככה זה כתוב עזרה? מישהו? זה דיי דחוף לי ניסיתי לטפל בקבצים עם C, אבל זה גם עשה בעיות (שגיאה שלא אומרת כלום בקשר למה גרם לה)
פורסם 2009 במאי 916 שנים מחבר #include <iostream>#include <fstream>#include <stdio.h>#include <string>#include "MyString.h"#include "SymbolTable.h"using namespace std;void advance(fstream f,MyString* currentCmd, int* line){ char* Cmd[50]; string tmpS; if (!f.eof()) { f.getline(Cmd,50); MyString TmpS(Cmd); (*currentCmd) = TmpS; if ((TmpS[0]!='/' && TmpS[0]!='(' && TmpS[0]!=' ') && TmpS.Length()>1) (*line)++; else if (TmpS[0]!='(') advance(f,currentCmd,line); } else { MyString EOC("EOC"); //end of code (*currentCmd)=EOC; }}לקוד הזה היו כמה וריאציותניסיתי להכניס כפרמטר לgetline מערך של תווים, ניסיתי להכניס string (את הtmpS, שזה מה שגרם לשגיאה שכתבתי בהודעה הראשונה, וניסיתי גם tmpS2 למקרה שזה case-sensitive למרות שעד כמה שזכור לי זה לא, זה גם לא עזר)ניסיתי לעשות getline(f,tmpS) וגם ניסיתי לשים מערך של תווים במקום הtmpSשום דבר לא עובד
פורסם 2009 במאי 916 שנים כשאתה מעביר אובייקטים לפונקציה, תשתמש ב-const reference. כלומר, במקום:void advance(fstream f,MyString* currentCmd, int* line)תעשה:void advance(fstream& f,MyString* currentCmd, int* line)או אפילו:void advance(const fstream& f,MyString* currentCmd, int* line)(אם זה לא פועל, תשתמש באופציה הקודמת)הקוד הראשון גורם לכך שכשאתה מעביר לפונקציה advance את ה-fstream, הוא משוכפל, ויכול להיות שזה מה שגורם לבעיות.בכל מקרה, שמתי לב גם שהגדרת את Cmd להיות באורך 50. הוא צריך להיות 51 (לפחות 1 יותר מהאורך של המחרוזת שאתה מתכנן לקרוא).
פורסם 2009 במאי 916 שנים מחבר כשאתה מעביר אובייקטים לפונקציה, תשתמש ב-const reference. כלומר, במקום: void advance(fstream f,MyString* currentCmd, int* line) תעשה: void advance(fstream& f,MyString* currentCmd, int* line) או אפילו: void advance(const fstream& f,MyString* currentCmd, int* line) (אם זה לא פועל, תשתמש באופציה הקודמת) הקוד הראשון גורם לכך שכשאתה מעביר לפונקציה advance את ה-fstream, הוא משוכפל, ויכול להיות שזה מה שגורם לבעיות. בכל מקרה, שמתי לב גם שהגדרת את Cmd להיות באורך 50. הוא צריך להיות 51 (לפחות 1 יותר מהאורך של המחרוזת שאתה מתכנן לקרוא). עבד, תודה! אין יותר שגיאותאני פשוט התייחסתי לדבר הזה בתור מצביע לקובץ >< ולכן פעולות על המצביע יעבדו בכל מקרה, טעות שלי >< ובקשר לקטע עם הגודל של Cmd - כן, פעם שעברה זה היה בגודל 51, אני יודע שיש את התו סוף מחרוזת פשוט מחקתי את זה כי חשבתי שאני לא צריך את זה יותר, ואז הוספתי מחדש רק בשביל הבדיקה
פורסם 2009 במאי 916 שנים בבקשה.הבעיה, אגב, כנראה נבעה מכך שאין לך גישה ל-copy constructor של ה-fstream (וגם אסור שתהיה, אחרת הוא ייצור לך שני אובייקטים שונים שמסוגלים לגשת לאותו קובץ). שים לב ש-fstream הוא לא מצביע, אלא ממש מחלקה.
פורסם 2009 במאי 916 שנים מחבר הבנתי שfstream זו מחלקה - בדיבאגינג ראיתי שיש לזה הרבה פרמטרים, וגם כל הקטע עם f.bla() דיי מצביע על זה שזו מחלקה(פשוט הפעם האחרונה שעבדתי עם C++ הייתה לפני המון זמן בקורס תכנות מונחה עצמים, לכן היו לי המון טעויות בהתחלה, ובין היתר לא השתמשתי ברפרנסים כמו שהמליצו לנו כי שכחתי מקיומם)אוקי, בעייה חדשהint main(int argc, char* argv[]){ ofstream tmpF; ifstream ASMCODE; ASMCODE.open(argv[1]);//should be argv[1] char* tmpN=new char[strlen(argv[1])+3]; strcpy(tmpN, "tmp"); strcpy(tmpN+3,argv[1]); tmpF.open(tmpN); cout<<tmpF.is_open();return 0; }מחקתי חלק נכבד מהקוד כי זה פשוט לא משנהאז הבעייה היא כזאת - זה מדפיס לי 0 בשורה אחת לפני אחרונה, מה שאומר (מן הסתם) שזה נכשל בפתיחת הקובץ בשם tmpNעכשיו, בargv[1] יש ערך, אני חושב... זה עושה לי את הפעולות הרצויות על הקובץ שאני מעביר, אז אני מניח שזה קלט את שם הקובץ ופתח אותו (הפלט מתאים לקלט שבקובץ)אבל זה לא פותח לי קובץ חדש בשם שאני רוצהכשעשיתי מערך של תווים שמכיל את השם הרצוי זה עבד יפה מאודכלומר, הבעייה היא עם הargv, אבל מה הבעייה? זה מערך של מצביעים לCHAR - מערך של מחרוזות, אז אני נותן לפונקציות מצביע לCHAR כמו שהן אמורות לקבל, למה זה לא עובד?בנוסף, אשמח לדעת איך אני מעביר פרמטרים כאלו בdebugging בVC++ 2008, ככה אולי אני אוכל לעלות על הבעייה לבד, אבל בינתיים...תודה מראש (ושוב תודה לשניצל על העזרה מקודם)איל
פורסם 2009 במאי 916 שנים תן לי להבין. התוכנית שלך מצפה לקבל בשורת הפקודה שם של קובץ, נכון?ואתה מריץ את התכנית הזו בלי להגדיר שום ארגומנטים לתכנית? אז מה שקורה הוא ש-argc == 1, ואז ל-[argv[1 אין משמעות (זה מכיל ערך אקראי).קודם כל, שהתכנית שלך תבדוק אם argc > 1 (אם לא, שתדפיס הודעת שגיאה ותצא).אם אתה רוצה לוודא מה הבעיה, אתה יכול גם להדפיס את [argv[1 במקום לנסות לפתוח את הקובץ, ולראות מה הוא מדפיס.חוץ מזה, לגבי העברת ארגומנטים:http://msdn.microsoft.com/en-us/library/cs8hbt1w.aspxגם כאן, אגב, יש לך בעיה של זליגה בהקצאה של tmpN. אתה מקצה עבורו את אורך המחרוזת + 3, ולא מותיר מקום ל-null (ואתה גם לא מוחק את המחרוזת בסוף התכנית, למרות שזה פחות משנה).
פורסם 2009 במאי 916 שנים אם כבר אתה עובד עם iostream, למה שלא תעבוד עם מחרוזות נורמליות?#include <string>
פורסם 2009 במאי 916 שנים מחבר תן לי להבין. התוכנית שלך מצפה לקבל בשורת הפקודה שם של קובץ, נכון?ואתה מריץ את התכנית הזו בלי להגדיר שום ארגומנטים לתכנית? אז מה שקורה הוא ש-argc == 1, ואז ל-[argv[1 אין משמעות (זה מכיל ערך אקראי).קודם כל, שהתכנית שלך תבדוק אם argc > 1 (אם לא, שתדפיס הודעת שגיאה ותצא).אם אתה רוצה לוודא מה הבעיה, אתה יכול גם להדפיס את [argv[1 במקום לנסות לפתוח את הקובץ, ולראות מה הוא מדפיס.חוץ מזה, לגבי העברת ארגומנטים:http://msdn.microsoft.com/en-us/library/cs8hbt1w.aspxגם כאן, אגב, יש לך בעיה של זליגה בהקצאה של tmpN. אתה מקצה עבורו את אורך המחרוזת + 3, ולא מותיר מקום ל-null (ואתה גם לא מוחק את המחרוזת בסוף התכנית, למרות שזה פחות משנה).כמו שציינתי, אני בטוח שarvg[1] קיים ומקבל ערך, אחרת שאר הקוד שלי לא היה עובד, והוא עבדעשיתי את זה בכל זאת, וזה לא יצא מהתוכנית, כלומר קיים argv[1]בקשר לזליגה - אצלי עשיתי את זה +4, כי חשבתי שזו הבעייה, אבל אז חשבתי שזה מיותר ולא באמת צריך את זה... אז טעיתי, בכל מקרה שכחתי להחזיר את זה ל3, משמע זה לא עובד גם עם ה+4אוקי, אז הוספתי כפרמטר את code.asm דרך הדיבאגר, אותו קובץ שאני גורר לתוכנית שלי, שלא עובדת...דרך הדיבאגר זה עובדעוד נסיון שלא דרך הדיבאגר - זה לא פותח קובץ חדשדרך הדיבאגר זה כןעוד נסיון - אני יוצר קיצור דרך ודרכו מעביר code.asm כפרמטר - עובד כמו שצריךרק גרירה של הקובץ עובדת חלקית - argv[1] קיים אבל פתיחת הקובץ נכשלה, מוזרקשה לי להאמין שזה לא איזה באג או בעייה או אלוהים יודע מה(בקיצור, אני חושב שזה לא משהו שאפשר לפתור)^^זליג - יותר נוח לי לעבוד עם המחלקה שאני מכירזה יוצר בעיות קטנות אבל ככה אני יודע אילו פונקציות יש לי ואיך להשתמש בהן
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.