עבור לתוכן

ב c++ פונקציה המחזירה אורך מערך (מס. אלמנטים)

Featured Replies

פורסם

יש לי מערך int ואני רוצה לדעת כמה אלמנטים הוא מכיל.

לדוגמא הקוד דלהלן:


int main()
{
int *myArr;
myFunction(myArr);


void myFunction(int *myA)
{
if(a == b)
myA[0] = 1;
if(a > b)
{
myA[0] = 1;
myA[1] = 2'
}

cout << "myA is consisted of " << countElements(myA);
}

countElements זה שם שאני נתתי. האם קיימת פונקציה מובנית ב ++C המחזירה את מספר האלמנטים במערך ?

תודה

פורסם

אגב, רק לידע כללי, מה שכתבת זה C, עם אלמנט 1 בלבד של C++ שהוא הCOUT, שגם הוא רק Class ואופרטור מועמס...

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

(ובמערך סטטי תצטרך לחלק בגודל "התא"...)

במערך דינאמי מה שהsizeof יחזיר לך זה למעשה גודל תא...

פורסם

התשובה היא לא. אי אפשר לדעת.

פורסם

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

פורסם
  • מחבר

תודה לעונים.

אעדכן את שאלתי:

נניח שאני רוצה לספור את מספר האלמנטיםבאופן הבא:


int i = 0;
while( myArr[i] != null)
++i;

שאלתי, מה אני יכול לכתוב במקום: !=null שזו כמובן שגיאת תחביר. במילים אחרות, כחצד מסומן האיבר האחרון או זה שאחריו במערך מסוג int?

פורסם

לא, אי אפשר,

זה לא כמו char* ששם יש לך NULL בסוף כל רצף תווים (STRING).

אחרי סיום המערך תקרה לך גלישה ממנו, טעות דיי קריטית,

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

פורסם
  • מחבר

תודה !

פורסם

יש פתרון קצת מסוכן.

תריץ לולאה אינסופית וכל פעם תקדם אינדקס שמואתחל ל-0 ותבדוק

אם יש שגיאה של יתיאה מגבולות המערך ע"י מנגנון ה-TRY ו-CATCH

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

פורסם

כן, אבל אז זה מחייב שימוש בCLASSHים

חוץ מזה, תכנותית, זה מאוד גרוע.

פורסם

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

פורסם

אתה יכול לצור מעטפת ל-array שבמהלך כל התוכנית תעקוב אחרי מה שאתה מכניס או מוציא מה-array.. (להשתמש ב-class שהפונקצית הוספה שלו גם תוסיף +1 ל-totalCount נגיד, והפונקצית מחיקה שלו תוריד 1...)

ואז להשתמש רק בצורה זו כדי לנהל arrays

פורסם

יש פתרון קצת מסוכן.

תריץ לולאה אינסופית וכל פעם תקדם אינדקס שמואתחל ל-0 ותבדוק

אם יש שגיאה של יתיאה מגבולות המערך ע"י מנגנון ה-TRY ו-CATCH

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

זה גם לא נכון,

תאורתית(וגם מעשית) אין סיבה שלא תוכל לגשת לקטע זיכרון הבא שאחרי סוף המערך שלך.

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

אתה יכול לצור מעטפת ל-array שבמהלך כל התוכנית תעקוב אחרי מה שאתה מכניס או מוציא מה-array.. (להשתמש ב-class שהפונקצית הוספה שלו גם תוסיף +1 ל-totalCount נגיד, והפונקצית מחיקה שלו תוריד 1...)

ואז להשתמש רק בצורה זו כדי לנהל arrays

נגיד, vector של STL.

פורסם

כן, אבל אז זה מחייב שימוש בCLASSHים

חוץ מזה, תכנותית, זה מאוד גרוע.

מסכים...ואין רע להישתמש במחלקות קיימות...גם שכותבים ב MFC זה שימוש במחלקות קיימות שבמקרה זה wrapper ל win32 api

אפשר גם לדעתי עםsizeof אם אתה יודע את הסוג של המערך..(תחשוב קצת ותעלה על זה ;) )

פורסם
  • מחבר

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

פורסם

אהה, מה קשור C++? המערך עליו אתה מדבר הוא מערך סטנדרטי של C.

שימוש במערך שמומש באמת בC++, (כמו בSTL) יתן לך את התוצאות המבוקשות.

בהקשר של מערכים דינמים(או פוינטרים כללים בכלל) אין הבדל בין C++ לC,

מהסיבה הפשוטה שC++ היא בסך הכול הרחבה של C.

ארכיון

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

דיונים חדשים