בעיה קטנה ב-C++...

פרפציל

New member
בעיה קטנה ב-C++...

אני מנסה לשלוח לפונקציה מערך בגודל 3 כרפרנס, משהו כזה:
int Arr[3]; foo(Arr);​
כשהגדרת הפונקציה היא כזו:
foo (int* &ArrRef)​
אז הקומפיילר מראה שגיאה כזו:
cannot convert "int [3]" to int *"​
אז ניסיתי במקום * בהגדרה לשים [], ואז הקומפיילר מזהה את זה בתור הגדרת מערך או משהו כזה, ומראה שגיאה אחרת. השאלה שלי היא איך בעצם אני שולח ומקבל מערך בגודל קבוע (שהוקצה סטטית) כרפרנס ?
 

Zack DA

New member
אם אני לא טועה, אתה לא יכול לעשות

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

פרפציל

New member
זהו, שהשאלה שלי היא

איך אני מקבל מערך ? עם [] בהגדרה קיבלתי שגיאת קומפילציה (התחביר המדויק מופיע בהודעה המקורית)
 

GLev

New member
חרשף...

בהגדרה פשוט תכתוב []arr ןכשאתה שולח אם arr זה המערך תכתוב arr בלי סוגריים מרובעות...
 

GLev

New member
חרשף...

בהגדרה פשוט תכתוב []arr ןכשאתה שולח אם arr זה המערך תכתוב arr בלי סוגריים מרובעות...
 

פרפציל

New member
לא עובד, גבי.. ../images/Emo13.gif הוא רוצה גודל

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

אלדד28

New member
למה אתה מעביר אותו כרפרנס?

תעבוד ככה:
void foo(int *arr) { arr[0] = arr[2]; } ... int Arr[3]; foo(Arr); ...​
זה יעבוד. הייתי ממליץ לך גם להעביר את גודל המערך כפרמטר נוסף לפונקציה.
 

no nick name

New member
ככה:

אוקי ככה: דבר ראשון שליחת מערך לפונקציה ביי ראף זוהי ברירת המחדל שלו, ככה שאין צורך להשתמש בסימן &. עכשיו ככה עושים: הקריאה: void(arr,size) והכרזת הפונקציה תעשה ככה: void foo(int arr[],int size) מקווה שעזרתי.
 

IdanR

New member
לא מדויק..

כאשר שולחים מערך לפונקציה, מה שנשלח ומתקבל בעצם זה המצביע למערך, אז זה כן ByRef מבחינה מסוימת, אבל המצביע עצמו מועתק למשתנה חדש בזיכון, שגודלו 4 בתים (גודל של מצביע כלשהו), ולא ניתן באמצעות הפונקציה לשנות את ההצבעה עצמה. מן הסתם, ההצבעה עצמה היא קבועה, כלומר: type* const ניתן לשנות את תכולת המערך, אבל לא את המצביע שלו (לגרום לו להצביע למקום אחר בזיכרון), אלא אם כן זה מצביע .. שהוקצה דינמית, או קיבל את הכתובת של המערך. לכן לא ניתן לשלוח reference של מצביע, מכיוון שreference היה מאפשר לשנות את ההצבעה המקורית, והיא const. (אני מניח אם כן, שיהיה אפשר במקום זה לשלוח const reference למצביע.. שווה לנסות.. אבל שוב - מיותר, ניתן פשוט לשלוח את השם של המערך, ולקבל אותו כמצביע)
 
למעלה