עבור לתוכן

העברת פרמטרים לתוכנית בדיבאגינג ובעייה בפתיחת קובץ, דחוף

Featured Replies

פורסם

בעייה חדשה בהודעה אחרונה

שלום אנשים

אני עובד ב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> with
1> [
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> with
1> [
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> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]

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

עזרה? מישהו? זה דיי דחוף לי :(

ניסיתי לטפל בקבצים עם C, אבל זה גם עשה בעיות (שגיאה שלא אומרת כלום בקשר למה גרם לה)

פורסם
  • מחבר

#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

שום דבר לא עובד

פורסם

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

פורסם
  • מחבר

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

עבד, תודה! :D אין יותר שגיאות

אני פשוט התייחסתי לדבר הזה בתור מצביע לקובץ >< ולכן פעולות על המצביע יעבדו בכל מקרה, טעות שלי ><

ובקשר לקטע עם הגודל של Cmd - כן, פעם שעברה זה היה בגודל 51, אני יודע שיש את התו סוף מחרוזת :) פשוט מחקתי את זה כי חשבתי שאני לא צריך את זה יותר, ואז הוספתי מחדש רק בשביל הבדיקה

פורסם

בבקשה.

הבעיה, אגב, כנראה נבעה מכך שאין לך גישה ל-copy constructor של ה-fstream (וגם אסור שתהיה, אחרת הוא ייצור לך שני אובייקטים שונים שמסוגלים לגשת לאותו קובץ). שים לב ש-fstream הוא לא מצביע, אלא ממש מחלקה.

פורסם
  • מחבר

הבנתי ש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, ככה אולי אני אוכל לעלות על הבעייה לבד, אבל בינתיים...

תודה מראש (ושוב תודה לשניצל על העזרה מקודם)

איל

פורסם

תן לי להבין. התוכנית שלך מצפה לקבל בשורת הפקודה שם של קובץ, נכון?

ואתה מריץ את התכנית הזו בלי להגדיר שום ארגומנטים לתכנית? אז מה שקורה הוא ש-argc == 1, ואז ל-[argv[1 אין משמעות (זה מכיל ערך אקראי).

קודם כל, שהתכנית שלך תבדוק אם argc > 1 (אם לא, שתדפיס הודעת שגיאה ותצא).

אם אתה רוצה לוודא מה הבעיה, אתה יכול גם להדפיס את [argv[1 במקום לנסות לפתוח את הקובץ, ולראות מה הוא מדפיס.

חוץ מזה, לגבי העברת ארגומנטים:

http://msdn.microsoft.com/en-us/library/cs8hbt1w.aspx

גם כאן, אגב, יש לך בעיה של זליגה בהקצאה של tmpN. אתה מקצה עבורו את אורך המחרוזת + 3, ולא מותיר מקום ל-null (ואתה גם לא מוחק את המחרוזת בסוף התכנית, למרות שזה פחות משנה).

פורסם

אם כבר אתה עובד עם iostream, למה שלא תעבוד עם מחרוזות נורמליות?

#include <string>

פורסם
  • מחבר

תן לי להבין. התוכנית שלך מצפה לקבל בשורת הפקודה שם של קובץ, נכון?

ואתה מריץ את התכנית הזו בלי להגדיר שום ארגומנטים לתכנית? אז מה שקורה הוא ש-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] קיים אבל פתיחת הקובץ נכשלה, מוזר

קשה לי להאמין שזה לא איזה באג או בעייה או אלוהים יודע מה

(בקיצור, אני חושב שזה לא משהו שאפשר לפתור)^^

זליג - יותר נוח לי לעבוד עם המחלקה שאני מכיר

זה יוצר בעיות קטנות אבל ככה אני יודע אילו פונקציות יש לי ואיך להשתמש בהן

ארכיון

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

דיונים חדשים