עבור לתוכן

מנסה להשתמש בתוכנה Borland C++ builder 6.0 כדי לנסות דוגמאות מספר הלימוד

Featured Replies

פורסם

אני מנסה לעשות דוגמאות מהספר וללמוד אבל בתוכנה הזאת כל פעם שאני רוצה לקמפל דוגמא אחת הוא דורש ממני לפתוח "project" וגם כן שומר עוד שלוש ארבע קבצים (חוץ מ CPP ו EXE)...

למישהו יש מושג איך אפשר לפשט את השימוש בתוכנה על מנת שיהיה יותר נוח לשימוש עבור הדוגמאות?

אם אני כבר כותב אז יש איזה תרגיל אצלי בספר על סוגי משתנים (GLOBAL AND LOCAL) וניסיתי בשני קומפילרים שונים ובדקתי שגיאות כתיב והוא פשוט לא קולט את המשתנה הגלובלי.

הקוד:


// This program demonstrates use of Global variable and local variable.

#include <iostream>
using namespace std;

void func1();
void func2();
int count; // this is a global variable

int main()
{
int i; // this is a local variable

for(i=0; i<10; i++) {
count = i * 2; \\ כאן מסומנת שגיאה
func1();
}

return 0;
}

void func1()
{
cout << "count: " << count; //access global count. גם כאן מסומנת שגיאה
cout << '\n'; // output a newline
func2();
}

void func2()
{
int count; // this is a local variable

for (count=0; count<3; count++) cout << '.';
}

פורסם

קודם כל, מה לעשות, הוא ייצור לך עוד כמה קבצים... בשלב הקמפול הוא ייצור לך קובץ obj, וחוץ מזה כל מיני IDE-ים יוצרים קבצים לנוחות שלהם (כמו קובץ שאומר איזה קבצים יש בפרוייקט ו-Makefile שאומר מה הפעולות שצריך לעשות על מנת לקמפל).

ולגבי השגיאה - איזו שגיאה הוא מדפיס לך בדיוק?

פורסם
  • מחבר

הוספתי קובץ TXT עם השגיאה.

אני בטוח שיש אפשרות לקומפיילר יותר פשוט עבור הדוגמאות...

[attachment deleted by admin]

פורסם

הוא אומר לך חד וחלק - הוא לא מצליח להבדיל בין ה-count שאתה הגדרת ואיזשהו count שמוגדר במקום אחר (שנבע מזה שעשית #include <iostream>)

יש שלושה פתרונות אפשריים:

1. שנה את השם של count למשהו אחר.

2. אל תעשה using namespace std (אבל אז תצטרך לעשות std::cout ולא סתם cout)

3. (הפתרון החכם) אל תשתמש במשתנים גלובאליים.

פורסם
  • מחבר

הוא אומר לך חד וחלק - הוא לא מצליח להבדיל בין ה-count שאתה הגדרת ואיזשהו count שמוגדר במקום אחר (שנבע מזה שעשית #include <iostream>)

יש שלושה פתרונות אפשריים:

1. שנה את השם של count למשהו אחר.

2. אל תעשה using namespace std (אבל אז תצטרך לעשות std::cout ולא סתם cout)

3. (הפתרון החכם) אל תשתמש במשתנים גלובאליים.

עשיתי את 1.

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

פורסם

אפשר אם הוא מוגדר בשני scope-ים שונים.

כלומר, אתה יכול להגדיר ככה:

int x;

int main() {
int x;
}

וזה לא יגרום לשגיאה, כי ה-x הראשון הוא גלובאלי והשני הוא לוקאלי ל-main.

הבעיה היא שה-count שהגדרת, וה-std::count שהוגדר ע"י המערכת הם באותו scope (שניהם גלובאליים).

וזה למה לא מגדירים משתנים גלובאליים.

פורסם
  • מחבר

אם זה Scope {} אז יש כאלה בMAIN ויש גם את האלה של הFOR....

לא ממש הבנתי מתי זה תקף....

פורסם

כן, scope זה כל פעם שיש {}.

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

אני מקווה שזה מסביר את זה היטב:

int a = 0; // Global. can be accessed anywhere in the program.

int main() {
int b = 1; // in the main() scope, can be accessed anywhere within main().

for (int i = 0 ; i < 10 ; ++i) {\
int c = 2; // in the for loop only. can only be accessed from within the loop.

c = b; // this is ok, because b was declared in a scope that contain the current scope
c = a; // Also ok, because A is global.
b = c; // also ok.

}

b = a; // OK, since A is global and b is in the current scope
b = c; // NOT OK, because C was declared in a different scope (we're outside of the loop now)

}

void f() {
// Right now we're in the scope of f(), and outside of main()
int d;

d = a; // This is ok, since a is global.
d = b; // NOT OK. b is in the scope of main(), and not in f().
}

פורסם

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

C++ בוחר ב-scope הכי קרוב, אבל לא תמיד זו הבחירה הנכונה. זה שהיום אתה רוצה להגיע למשתנה המקומי לא אומר שמחר לא תרצה להגיע גם למשתנה הגלובלי. כמו כן מי שרואה את הקוד (כן, גם אתה) לא בהכרח ישים לב שיש כאן scope מקומי ולא גלובלי. בכל מקרה בד"כ הבעיה היא שהשם שנבחר לא מספיק טוב.

על כן עדיף לדאוג שאין שמות כפולים.

פורסם

הדבר ה"נכון" לעשות זה להחליף את ה- using namespace std ב- using std::cout.

נראה כאילו אתה עושה גם include למשהו של STL שאולי הוא מיותר.

פורסם
  • מחבר

הדבר ה"נכון" לעשות זה להחליף את ה- using namespace std ב- using std::cout.

נראה כאילו אתה עושה גם include למשהו של STL שאולי הוא מיותר.

קודם כל תודה רבה שניצל :xyxthumbs::) עכשיו הכל הרבה יותר ברור בנושא סוגי המשתנים....

בומרנג:

אני לא ממש מבין את השורות הראשנות שאני כותב כי אני מעתיק אותם מהספר והיה כתוב שבהמשך יהיה הסבר מעמיק יותר בנושא השורות הללו....

פורסם

אז בינתיים אל תשנה אותן. :)

אבל בעיקרון מה שהוא אמר נכון, וגם שצריך להימנע מהגדרת משתנים גלובליים (או אם אתה חייב, להשתמש ב-namespace (בהמשך תלמד מה זה...))

בשפות תכנות מתקדמות יותר (Java ו-C#) בכלל אי אפשר להגדיר משתנים גלובליים.

ארכיון

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

דיונים חדשים