ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 17:55
נושא ההודעה:

שלום,
אני לאחרונה התחלתי ללמוד C++ אבל משהו אחד בלבל אותי,
ההבדל בין הנקודה לבין החץ.

אני מבין שעם לדוגמה אני עושה CLASS כלשהוא, אז אני עושה:
class.member();
כלומר ככה אני פונה לפונקציה חברה, אז מה ההבדל בין זה לבין
class->member();
האם החץ הוא למשתנים , השמה וקריאה שלהם, והנקודה היא לקריאה לפונקציות?
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 31/07/2003 - 18:41
נושא ההודעה:

לא.

בנקודה משתמשים עם מופע של המחלקה ובחץ משתמשים עם מצביע למופע של המחלקה.

למשל:
קוד:
SomeClass someVar();
someVar.method();
int i = someVar.data;

SomeClass * ptr = new SomeClass();
ptr->method();
int i = ptr->data;
delete ptr;

 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
wliadלא בפורום כעתSite Moderator ת.הצטרפות: 25/05/2003 · הודעות: 1285 · מיקום: צפון הארץ
 

הודעה פורסם: 31/07/2003 - 19:01
נושא ההודעה:

באופן עקרוני ענו לך, אבל בוא ננסה לחדד את התשובה הזו.

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

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

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

לדוגמא טובה לשימוש השונה באופרטורים, ראה הודעה למעלה (של האנונימי) Cool

[ נערך על-ידי wliad בתאריך 31/07/03 16:04:30 ]

_________________
Image Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם Yahoo Messenger MSN Messenger מספר ICQ 
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 19:28
נושא ההודעה:

תודה רבה Smile
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
z9u2K ת.הצטרפות: 18/01/2003 · הודעות: 791 · מיקום: טוב
 

הודעה פורסם: 31/07/2003 - 19:54
נושא ההודעה:

או, אם אתה רוצה עוד הסבר, אופרטור החץ הוא למעשה קיצור לצורה:
קוד:

(*p).hello(); // p is a pointer, hello() is a member function

[addsig]

_________________
Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 20:37
נושא ההודעה:

תודה על העזרה,
אגב,
למה הקוד הבא לא עובד?


#include


int main()
{

char *MySTR;
MySTR = new char[100];

MySTR="Abc";
cout<
delete []MySTR; //This cause the segmatation fault

return 0;
}


הוא מחזיר לי Segmantation Fault
סלחו לי הקוד קצת נעלם...

[ נערך על-ידי אייל בתאריך 31/07/03 17:54:51 ]
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
z9u2K ת.הצטרפות: 18/01/2003 · הודעות: 791 · מיקום: טוב
 

הודעה פורסם: 31/07/2003 - 21:17
נושא ההודעה:

אתה לא יכול לתת ערך למחרוזת ע"י אהופרטור =.
מה שאתה עושה בעצם זה אתה מקצה מידע, שולח אותו לעזאזל, גורם ל- MySTR להצביע למקום קבוע בזיכרון ולא למקום שאליו הקצית.
מה שאתה מתכוון לעשות הוא:
קוד:

#include <iostream>
using namespace std;
int main()
{
char *MySTR = 0;
MySTR = new char[100];
strcpy(MySTR, "ABC");
cout << MySTR << endl;
delete []MySTR;
return 0;
}


[addsig]

_________________
Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
z9u2K ת.הצטרפות: 18/01/2003 · הודעות: 791 · מיקום: טוב
 

הודעה פורסם: 31/07/2003 - 21:18
נושא ההודעה:

ציטוט:

ב 2003-07-31 18:17, z9u2K כתב:
אתה לא יכול לתת ערך למחרוזת ע"י האופרטור =. אל תשכח שמדובר במצביע.
מה שאתה עושה בעצם זה אתה מקצה מידע וגורם ל- MySTR להצביע למקום קבוע בזיכרון ולא למקום שאליו הקצית. בעצם, יש לך כאן דליפת זיכרון כי 100 התווים שהקצית לא מוצבעים ע"י אף אחד ולכן לא משוחררים.
מה שאתה מתכוון לעשות הוא:
קוד:

#include <iostream>
using namespace std;
int main()
{
char *MySTR = 0;
MySTR = new char[100];

strcpy(MySTR, "ABC");

cout << MySTR << endl;

delete []MySTR;
return 0;
}




[addsig]

_________________
Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
z9u2K ת.הצטרפות: 18/01/2003 · הודעות: 791 · מיקום: טוב
 

הודעה פורסם: 31/07/2003 - 21:24
נושא ההודעה:

אהה, ואם אתה רוצה גם להיות בטוח שהזיכרון הוקצע ולא הייתה הצפה, תחליף את השורה:
קוד:

MySTR = new char[100];


בשורות:
קוד:

try
{
MySTR = new char[100];
}

catch (bad_alloc)
{
cerr << "Memory overflow\n";
abort();
}

[addsig]

_________________
Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 21:39
נושא ההודעה:

ציטוט:

ב 2003-07-31 18:24, z9u2K כתב:
אהה, ואם אתה רוצה גם להיות בטוח שהזיכרון הוקצע ולא הייתה הצפה, תחליף את השורה:
קוד:

MySTR = new char[100];


בשורות:
קוד:

try
{
MySTR = new char[100];
}

catch (bad_alloc)
{
cerr << "Memory overflown";
abort();
}



אז בעצם הפקודה try מנסה את זה, ועם זה לא מצליח זה מחזיר שגיאה של badd_alloc והפקודה CATCH מוכנה מראש לתפוס את השגיאה,
ועם זה קורה זה יוצא,
איך באמת יודעים מה השם של השגיאה? כלומר bad_alloc מאיפה הגעת אליו?
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
z9u2K ת.הצטרפות: 18/01/2003 · הודעות: 791 · מיקום: טוב
 

הודעה פורסם: 31/07/2003 - 22:10
נושא ההודעה:

זאת מחלקה סטנדרטית כחלק מהספריה הסטנדרטית.
האופרטור new מנסה להקצות זיכרון. אם הוא לא מצליח, הוא זורק (throw) חריגה (exception) מסוג bad_alloc שהיא מחלקה שמוגדרת איפשהו באחד מקבצי הכותר של הספריה (אני לא בטוח איפה Smile ).

אם אתה לומד מספר, תדפדף לפרק "שגיאות והתראה על חריגות" או משהו דומה...

ואגב, בשביל להשתמש ב- strcpy תצטרך להכליל גם את string.
[addsig]

_________________
Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 22:28
נושא ההודעה:

ציטוט:

ב 2003-07-31 19:10, z9u2K כתב:
זאת מחלקה סטנדרטית כחלק מהספריה הסטנדרטית.
האופרטור new מנסה להקצות זיכרון. אם הוא לא מצליח, הוא זורק (throw) חריגה (exception) מסוג bad_alloc שהיא מחלקה שמוגדרת איפשהו באחד מקבצי הכותר של הספריה (אני לא בטוח איפה Smile ).

אם אתה לומד מספר, תדפדף לפרק "שגיאות והתראה על חריגות" או משהו דומה...

ואגב, בשביל להשתמש ב- strcpy תצטרך להכליל גם את string.


להכלייל את string? לא הייתי צריך,
הקומפיילר g++ לא אמר שזה לא מוגדר.

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

ואז סוף סוף אני אתחיל ללמוד לפתח בGTK או QT, עוד לא החלטתי
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 22:31
נושא ההודעה:

אגב מה זה enum כלומר איזה סוג של מחלקה זה ומה מיוחד בו?
כי בספר של שפת C שיש לי שממנו אני למדתי (למדתי קודם C ועכשיו C++) לא רשום..
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
wliadלא בפורום כעתSite Moderator ת.הצטרפות: 25/05/2003 · הודעות: 1285 · מיקום: צפון הארץ
 

הודעה פורסם: 31/07/2003 - 22:45
נושא ההודעה:

בעית הסגמנטציה:
אוקיי, זה z9 נתן לך הסבר איך לעקוף את השגיאה, אבל לא הסביר מה השגיאה. בוא ננסה להבין.
קוד:
int main()
{
char *mystr; // mystr הגדרנו מצביע בשם
mystr = new char[100]; // כאן הקצנו זיכרון עבור מערך תווים בגודל 100
mystr = "ABC"; // "ABC" קיבל את הכתובת של המחרוזת הזמנית mystr
cout << mystr << endl; // פה מתחוללת הבעיה
}

הבעיה היא ש"ABC" היא מחרוזת זמנית. היא נוצרת בזיכרון למשך ביצוע שורת ההצבה בלבד. ברגע שמסתיימת ההצבה, משוחרר הזיכרון אותו היא תופסת. המצביא mystr ממשיך עם זאת להצביע לאותו מקום בו הוקצתה המחרוזת אך מקום זה כבר אינו חוקי.
כאשר אנו מפעילים על mystr את אופרטור הפלט '>>', נוצרת שגיאת זמן ריצה הנובעת מכך שאנו מנסים לגשת לזיכרון שאינו עומד לרשותנו.

חריגות בהקצאת זיכרון:
הפתרון שz9 הציע לך משתמש במנגנון החריגות (Exceptions) של השפה. לא אכנס לעומק מנגנון החריגות, אך אסביר בקצרה מה בדיוק משמעות ההצעה של z9.

בלוק {}try מכיל בתוכו קריאות לפונקציות ואופרטורים. בשפת ++C חלק גדול מהאופרטורים והפונקציות הסטנדרטיות (החל מגרסא 3 של השפה) זורקים (throw) חריגות כאשר משהו לא מתנהל כצפוי בזמן הריצה. במקרה הזה, האופרטור new זורק את החריגה הסטנדרטית bad_alloc. משמעות הדבר היא שבלוק try נועד לנסות לבצע משהו בצורה בטוחה. אם אירע אירוע חריג בעת הריצה של אחת הפונקציות בבלוק, נזרקת חריגה והבלוק מסתיים מיד.

במקרה שנזרקה חריגה מבלוק try, היא ממשיכה להזרק עד אשר המעבד פוגש בלוק ()catch. בבלוק catch מטפלים בחריגה ספציפית (המופיעה בסוגריים). הכוונה היא, מודיעים הודעה מתאימה, או מחפשים דרך אחרת לביצוא הפעולה שכשלה וכו'.

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

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

Cool
[addsig]

_________________
Image Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם Yahoo Messenger MSN Messenger מספר ICQ 
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 22:55
נושא ההודעה:

תודה על התשובה,
מסתבר אגב שחריגה (exeption) מופיעה במדריך שאני לומד ממנו:
http://cplus.eitan.ac.il/
אני עדיין לומד ועוד לא הגתעי לחלק שם (אני כרגע בהורשה) ועד מחר בערב אני כבר אדע C++....
שאני אדע הכל אז כמובן שאני אדע על הEXCEPTION וכל מה שצריך....

אגב אנ גם לומד HP במקביל (ליתר דיוק סיימתי ללמוד הכל חוצמהחלק על MYSQL),

סוף סוף אני יוכל לעבור ללינוקס ב100%, עכשיו אני אדע (אני מקווה) גם לפתח תוכנות ללינוקס וגם דברים בPHP כי לפניכן ידעתי ASP וזה קצת ביעיתי לפתח בלינוקס וגם מייקרוסופט הואילה בטובה לשנות את השפה... למשהו שלא קשור בכלל..
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
wliadלא בפורום כעתSite Moderator ת.הצטרפות: 25/05/2003 · הודעות: 1285 · מיקום: צפון הארץ
 

הודעה פורסם: 31/07/2003 - 22:56
נושא ההודעה:

ציטוט:

ב 2003-07-31 19:31, אייל כתב:
אגב מה זה enum כלומר איזה סוג של מחלקה זה ומה מיוחד בו?
כי בספר של שפת C שיש לי שממנו אני למדתי (למדתי קודם C ועכשיו C++) לא רשום..


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

enum, מנגנון האנומרציה (מספור). enum יוצר עבורך טיפוס נתונים סדור, כלומר טיפוס נתונים אשר בין הנתונים השונים שהוא יכול להכיל שורר סדר. למשל ימי השבוע:
קוד:
enum days{sun=1, mon, tue, wed, thu, fri, sat};

כאן נוצר טיפוס הנתונים days. משתנה מסוג days יכול להכיל כל אחד מהערכים sun עד sat. הערך sun שקול למספר השלם 1, הערך mon שקול ל-2 וכן הלאה.

בשפת ++C נהוג להשתמש בהגדרת enum במחלקה לצורך הגדרת קבועים של המחלקה. למשל:
קוד:
class myclass
{
public:
enum {SIZE = 100};
...
private:
float data[SIZE];
...
}

כאן, data הוא מערך של float בגודל הסודר SIZE (השווה ל-100).

המלצה: בעת הידור תוכניות ++C בלינוקס, מומלץ להשתמש במהדר ++c. לדעתי הוא יותר יעיל מ++g.
Cool
[addsig]

_________________
Image Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם Yahoo Messenger MSN Messenger מספר ICQ 
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
wliadלא בפורום כעתSite Moderator ת.הצטרפות: 25/05/2003 · הודעות: 1285 · מיקום: צפון הארץ
 

הודעה פורסם: 31/07/2003 - 23:01
נושא ההודעה:

ציטוט:
ב 2003-07-31 19:55, אייל כתב:
אני עדיין לומד ועוד לא הגתעי לחלק שם (אני כרגע בהורשה) ועד מחר בערב אני כבר אדע C++....

אני עובד עם ++C כבר כמה שנים טובות ואני עדיין לומד דברים חדשים כמעט על בסיס יומי. עד מחר בערב אולי תדע את הסמנטיקה הבסיסית של השפה, אבל מפה ללדעת ++C יש עוד דרך ארוכה והרבה מאד שעות של תסכול Laughing . עם זאת נאי מאחל לך בהצלחה בלמידה והמשך התנסות מהנה עם השפה הכי מוצלחת לדעתי שפותחה אי פעם.

Cool
[addsig]

_________________
Image Image
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם Yahoo Messenger MSN Messenger מספר ICQ 
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אייל ת.הצטרפות: 24/04/2003 · הודעות: 3203 ·
 

הודעה פורסם: 31/07/2003 - 23:01
נושא ההודעה:

ושוב תודה,
הסיבה שלא פתחתי נושא חדש זה בגלל שזה מופיע בעמוד הראשי,
ולא רציתי להציף 6 שאלות בעמוד הראשי על תכנות וכולם ממני...

ולמען האמת לא הכרתי את c++ אבל גם לא מצאתי ביניהם הבדל....
הסיבה שהכרתי את g++ זה בגלל שראיתי תמיד בקמפול של תוכנות שהם משתמשים בg++

אבל מה זה חשוב?
העיקר שהם שתיהם עושים את העבודה לא? Smile
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אייל
  2. אורח
  3. wliad
  4. אייל
  5. z9u2K
  6. אייל
  7. z9u2K
  8. z9u2K
  9. z9u2K
  10. אייל
  11. z9u2K
  12. אייל
  13. אייל
  14. wliad
  15. אייל
  16. wliad
  17. wliad
  18. אייל