מערכים ב-C++ - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

מערכים ב-C++


slimshady21

Recommended Posts

שלום התחלתי ללמוד C++ (אחרי שלמדתי כבר C). אני לומד מהאתר eitan, ובקושי רשום שם על עבודה עם מערכים. איך למשל אני קורא לפונקציות operator עם מערך? (כדי להוסיף/להוריד איברים). או איך אני קורא לפונקצית בנאי/מפרק כשאני מוסיף או מוריד איברים? ובכלל לעשות כל מיני פעולות על המערך עצמו ולא על איבר ספציפי

ושאלה לא קשורה- סתם כדי לדעת בערך כמה זמן לוקח ללמוד את כל C++ אחרי שיודעים כבר את C (ברמה די טובה)?

קישור לתוכן
שתף באתרים אחרים

אי אפשר להוסיף או להוריד איברים ממערך, הגודל שלו קבוע.

מערכים כמעט ולא השתנו בין C ל-C++, למעט האופרטורים המשמשים להקצאת ושחרור (ב-C משתמשים ב-malloc ו-free, ב-C++ משתמשים ב-new ו-delete).

ההגבלה העיקרית על מערכים של אובייקטים היא שלאובייקטים חייב להיות default constructor (אחרת אתה חייב להשתמש במערך של מצביעים).

אם אתה רוצה מערכים דינאמיים, תלמד על vector.

והשאלה השנייה:

קצת קשה להגדיר "כל c++"... את כל ה-keywords אפשר ללמוד די מהר, אבל השפה מכילה עוד הרבה דברים (כגון STL), וחוץ מזה יש הרבה ללמוד בנושאי OOP שאינם קשורים ישירות לשפה, אלא יותר לתכנות עצמו.

קישור לתוכן
שתף באתרים אחרים

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

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

כל הזמן לומדים עוד ועוד, ב-C++ מתחבא המון כוח (ויש האומרים גם אי שפיות ממימד אחר!!!) וכל הזמן לומדים דברים חדשים. גם דרך העבודה עם C++ והשפה עצמה משתנים עם הזמן. היום עובדים עם C++ באופן שונה לגמרי ממה שחשבו לפני 10 ו-15 שנה. גם יש דברים חדשים כגון template metaprogramming וכו'.

קישור לתוכן
שתף באתרים אחרים

אי אפשר להוסיף או להוריד איברים ממערך, הגודל שלו קבוע.

מערכים כמעט ולא השתנו בין C ל-C++, למעט האופרטורים המשמשים להקצאת ושחרור (ב-C משתמשים ב-malloc ו-free, ב-C++ משתמשים ב-new ו-delete).

ההגבלה העיקרית על מערכים של אובייקטים היא שלאובייקטים חייב להיות default constructor (אחרת אתה חייב להשתמש במערך של מצביעים).

אם אתה רוצה מערכים דינאמיים, תלמד על vector.

ברור שהתכוונתי למערך דינמי. ומה הכוונה תלמד על VECTOR? מה זה בכלל? וחוץ מזה מערכים דינמיים זה לא אותו עיקרון כמו ב-C? פשוט מגדירים מצביע לתחילת המערך ומקצים לו . אי אפשר ככה?

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

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

כל הזמן לומדים עוד ועוד, ב-C++ מתחבא המון כוח (ויש האומרים גם אי שפיות ממימד אחר!!!) וכל הזמן לומדים דברים חדשים. גם דרך העבודה עם C++ והשפה עצמה משתנים עם הזמן. היום עובדים עם C++ באופן שונה לגמרי ממה שחשבו לפני 10 ו-15 שנה. גם יש דברים חדשים כגון template metaprogramming וכו'.

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

קישור לתוכן
שתף באתרים אחרים

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

אני מדבר על דברים שבשפה כגון Exceptions, template metaprogramming, multiple inheritence, STL

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

וכן טכניקות שונות של design patterns.

אל תתרגש, יהיה לך הרבה זמן ללמוד, לאט לאט.

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

vector הוא חלק מספרית STL (שהיא חלק מ-C++). זו מחלקה (למעשה template) שמאפשרת לך להגיד מערכים שמשנים את גודלם באופן אוטמטי:

vector<int> v;

v.push_back( 5 );
v.push_back( 7 );
// now v holds 2 ints
v[0] = 3;
a = v[1];

v.resize(100);
// now v holds 100 ints
v[99] = 1;


ה-vector מנהל בעצמו את הזכרון ומבצע הקצאות בהתאם לצורך.

קישור לתוכן
שתף באתרים אחרים

מוזר עד עכשיו תמיד השתמשתי במערכים דינמיים ב-C ולא ראיתי בשום מקום שכתוב שזה לא טוב. אז איזה דרך אחרת כדאי ליצור מערכים ב-C? אפשר לעשות מערך מצביעים אבל בכל מקרה זה יצטרך להיות דינמי כדי שיהיה אפשר להגדיל/להקטין אותו.

ואין דרך פשוטה יותר ליצור מערך ממה שרשמת כרגע? כי אתה מדבר איתי על דברים כמו STL, TEMPLATE, DESIGN PATTERN שאין לי מושג מהם, רק התחלתי ללמוד את כל הנושאים של המחלקות מהאתר. ואני מעדיף ללכת לפי הסדר ולא להתחיל להסתבך עם עוד נושאים אחרים. אחרי שאני יסיים את המדריך שמה אני אלמד STL (כי לא נראה לי שיש שם את זה). אבל אין איזה שיטה אחרת ליצירת מערכים בינתיים לתוכניות התרגול שאני עושה? או שעדיף כבר להשתמש במערכים סטטיים בינתיים?

Component תודה על המדריך

קישור לתוכן
שתף באתרים אחרים

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

קישור לתוכן
שתף באתרים אחרים

בגדול ב-C ו-C++ למערכים יש גודל קבוע מהרגע שיוצרים אותם ועד לרגע שהורסים אותם.

אבל כמובן שיש יוצאי דופן ויש דרכים לעשות את מה שאתה רוצה.

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

אבל אני ממליץ לך לא להשתמש בזה! בד"כ זה בדיוק הדרך הרעה לפתור בעיה.

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

אולי אתה יודע שלעולם לא יהיו יותר מ-MAX תאים במערך? במקרה זה עדיף להקצות מראש מערך בגודל MAX.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...