נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: החזרת מערך מפונקציה בשפת C

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
יואב
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 18 July 2007 בשעה 16:44 | IP רשוּם
ציטוט יואב

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


חזרה לתחילת העמוד הצג את כרטיס החבר של יואב חפש הודעות אחרות של יואב בקר בדף הבית של יואב
 
מצביע ל
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 18 July 2007 בשעה 17:50 | IP רשוּם
ציטוט מצביע ל

מצביעים

או במילים אחרות

pointers
חזרה לתחילת העמוד הצג את כרטיס החבר של מצביע ל חפש הודעות אחרות של מצביע ל בקר בדף הבית של מצביע ל
 
הלוחם
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 19 July 2007 בשעה 00:18 | IP רשוּם
ציטוט הלוחם

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

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

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 19 July 2007 בשעה 04:19 | IP רשוּם
ציטוט יואב

אז בפונקציית הMAIN אני צריך להגדיר את המצביע ושהמצביע יצביע לתא הראשון של המערך?
לדוג'
begin
int *p;
int a[100];
*p=&a[0];
*p=function(a);
end

כשבפונקציה FUNCTION אני משנה את המערך a?


חזרה לתחילת העמוד הצג את כרטיס החבר של יואב חפש הודעות אחרות של יואב בקר בדף הבית של יואב
 
gg
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 19 July 2007 בשעה 12:26 | IP רשוּם
ציטוט gg

קוד:
&a

זה שווה ערך עד כמה שאני יודע ל-
קוד:
&a[0]


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

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 19 July 2007 בשעה 20:14 | IP רשוּם
ציטוט Fate

כנראה שעשיתי טעות כשלא עניתי בזמן...
אפשר להחזיר מערך... אבל מישהו צריך לשחרר אותו...
והדוגמאות של gg זה לא אותו דבר!!
קוד:

char * make_string()
{
 char * str = malloc(20);
 strcpy(str,"Hi");
 return str;
}

int main()
{
 char * s;
 s = make_string();
 printf("%s",s);
 free(s);
 return 0;
}


אפשר גם להעביר מערך ושהפונקציה תשנה אותו...
קוד:

void set_string(char * s)
{
 strcpy(s,"Hi");
}

int main()
{
 char s[20];
 set_string(s);
 printf("%s",s);
 return 0;
}


קוד:

&a[0]

זה מצביע לאיבר הראשון של המערך...
קוד:

&a

זה מצביע למצביע לאיבר הראשון..


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

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 19 July 2007 בשעה 22:56 | IP רשוּם
ציטוט אלצ'קו

סיכום:
  • ב-C אי-אפשר להחזיר מערכים.
  • במקרים מסויימים, וחשוב להדגיש שלא תמיד, פועל הכלל ש-arrays decay into pointers. מערכים אינם מצביעים ומצביעים אינם מערכים.
  • על-פי הגדרה הכתובות ‎&a ו-‎&a[0]‎ יהיו זהות (בהנחה ש-a הוא מערך C אמיתי). על-פי הגדרה, הטיפוסים יהיו שונים. לכן בסופו של דבר, הביטויים אינם שקולים.
  • אם אתה רוצה לקבל את השקול של החזרה מערך מפונקציה לא מספיק שתחזיר מצביע לתחילת המערך; אתה צריך גם להחזיר גודל. C אינה מאפשרת החזרה של יותר ממשתנה אחד, ולכן כדאי ליצור struct שיכיל מצביע וגודל.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
Fate
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 20 July 2007 בשעה 03:07 | IP רשוּם
ציטוט Fate

אלצ'קו...
קוד:

#include <stdio.h>

int main(void)
{
    char * a = malloc(20);
    printf("%x ?? %x",&a,&a[0]);
    return 0;
}

הקוד הבא מדפיס שני כתובות שונות....
אחד מהם בHeap, השני בStack...


ואני גם חולק על סעיף 2... מערכים זה מצביע לאיבר הראשון, והפוך...
ההבדל הוא מיקות הזיכרון (Heap?Stack?BSS?)
חזרה לתחילת העמוד הצג את כרטיס החבר של Fate חפש הודעות אחרות של Fate
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 20 July 2007 בשעה 09:09 | IP רשוּם
ציטוט אלצ'קו

Fate כתב:
אלצ'קו...
קוד:

#include <stdio.h>

int main(void)
{
    char * a = malloc(20);
    printf("%x ?? %x",&a,&a[0]);
    return 0;
}

הקוד הבא מדפיס שני כתובות שונות....
אחד מהם בHeap, השני בStack...


ואני גם חולק על סעיף 2... מערכים זה מצביע לאיבר הראשון, והפוך...
ההבדל הוא מיקות הזיכרון (Heap?Stack?BSS?)


הקוד הבא לא תקני כי שכחת stdlib, אבל אתה צודק שהניסוח שלי לא היה מושלם. ערכתי את ההודעה כדי שהכוונה תהיה ברורה: אם a הוא מערך אז ‎&a ו-‎&a[0]‎ מצביעים לאותו מקום, על-פי הגדרת המושג מערך והאופרטור []. אם a הוא מצביע אז ‎&a ייתן את הכתובת של a עצמו, ואילו ‎&a[0]‎ ייתן את הערך של a (הכתובת שאליה הוא מצביע).

זו אגב עוד הוכחה לכך שמערכים ומצביעים אינם זהים. שנה את הקוד שלך כך שייכתב:
קוד:
char a[20];

ותראה מה התוצאות.

בכל-אופן, אתה יכול לנסות לחלוק על הסעיף השני, אבל זה חסר טעם. קרא את TCPL, את החלקים הרלבנטיים באתר http://c-faq.com או את הפרק בשם Chapter 4. The Shocking Truth: C Arrays and Pointers Are NOT the Same!‎ בספר Expert C Programming: Deep C Secrets.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
Fate
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 20 July 2007 בשעה 14:48 | IP רשוּם
ציטוט Fate

א) בשביל מה אני צריך את stdlib?

ב) אני יודע מה התוצאות כאשר מוגדר מערך על הStack, פשוט רציתי שלאנשים לא יהיה בראש ש&a וגם &a[0] זה אותו ערך...

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

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 20 July 2007 בשעה 15:33 | IP רשוּם
ציטוט אלצ'קו

Fate כתב:
א) בשביל מה אני צריך את stdlib?

ב) אני יודע מה התוצאות כאשר מוגדר מערך על הStack, פשוט רציתי שלאנשים לא יהיה בראש ש&a וגם &a[0] זה אותו ערך...

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


א) בשביל malloc. חפש בגוגל man malloc.

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

ג) ואז איך תדע איפה המערך נגמר? אתה חייב לציין גודל.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
Fate
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 21 July 2007 בשעה 18:26 | IP רשוּם
ציטוט Fate

א) משום מה הוא לא מציק לי שmalloc לא מוגדר, כנראה שהVC לא בדיוק סטנדרטי..
ב) טוב
ג) בסי אתה יכול להשתמש במערך בלי לדעת איפה הוא נגמר, לכן גם כל הבעיות אבטחה, אבל מערך הוא עדיין מערך גם בלי שתדע את הגודל שלו...
חזרה לתחילת העמוד הצג את כרטיס החבר של Fate חפש הודעות אחרות של Fate
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 21 July 2007 בשעה 21:25 | IP רשוּם
ציטוט אלצ'קו

Fate כתב:
א) משום מה הוא לא מציק לי שmalloc לא מוגדר, כנראה שהVC לא בדיוק סטנדרטי..
ב) טוב
ג) בסי אתה יכול להשתמש במערך בלי לדעת איפה הוא נגמר, לכן גם כל הבעיות אבטחה, אבל מערך הוא עדיין מערך גם בלי שתדע את הגודל שלו...


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

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 22 July 2007 בשעה 12:20 | IP רשוּם
ציטוט Fate

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

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 23 July 2007 בשעה 20:51 | IP רשוּם
ציטוט אלצ'קו

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

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

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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