כותב |
|
יואב אורח
הצטרף / הצטרפה: 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 רשוּם
|
|
|
|
זה שווה ערך עד כמה שאני יודע ל-
ואני לא רואה סיבה שהפונקציה תחזיר את המצביע שהיא קיבלה (כשמדובר במערכים בכל מקרה), המערך ישתנה גם ככה...
|
חזרה לתחילת העמוד |
|
|
Fate פורומיסט על
הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת הודעות: 571
|
נשלח בתאריך: 19 July 2007 בשעה 20:14 | | IP רשוּם
|
|
|
|
כנראה שעשיתי טעות כשלא עניתי בזמן... אפשר להחזיר מערך... אבל מישהו צריך לשחרר אותו... והדוגמאות של 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; }
|
|
|
זה מצביע לאיבר הראשון של המערך...
זה מצביע למצביע לאיבר הראשון..
והדוגמאות קוד שהבאתי כאן הן תיכנות רע בגלל שאני לא שומר על גדלים..
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג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 רשוּם
|
|
|
|
אלצ'קו...
קוד:
#include <stdio.h>
int main(void) { char * a = malloc(20); printf("%x ?? %x",&a,&a[0]); return 0; }
|
|
|
הקוד הבא מדפיס שני כתובות שונות.... אחד מהם בHeap, השני בStack...
ואני גם חולק על סעיף 2... מערכים זה מצביע לאיבר הראשון, והפוך... ההבדל הוא מיקות הזיכרון (Heap?Stack?BSS?)
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג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 (הכתובת שאליה הוא מצביע).
זו אגב עוד הוכחה לכך שמערכים ומצביעים אינם זהים. שנה את הקוד שלך כך שייכתב:
ותראה מה התוצאות.
בכל-אופן, אתה יכול לנסות לחלוק על הסעיף השני, אבל זה חסר טעם. קרא את 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 רשוּם
|
|
|
|
א) בשביל מה אני צריך את stdlib?
ב) אני יודע מה התוצאות כאשר מוגדר מערך על הStack, פשוט רציתי שלאנשים לא יהיה בראש ש&a וגם &a[0] זה אותו ערך...
ג) בקשר להחזרת מערך, אפשר להחזיר מצביע לאיבר הראשון שיתנהג כמו מערך.
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג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 רשוּם
|
|
|
|
א) משום מה הוא לא מציק לי שmalloc לא מוגדר, כנראה שהVC לא בדיוק סטנדרטי.. ב) טוב ג) בסי אתה יכול להשתמש במערך בלי לדעת איפה הוא נגמר, לכן גם כל הבעיות אבטחה, אבל מערך הוא עדיין מערך גם בלי שתדע את הגודל שלו...
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג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 רשוּם
|
|
|
|
ואם אתה יודע מראש מה גודל המערך שאמור לחזור? (נגיד מוגדר בקבוע...) אז אתה גם יכול להשתמש בו בלי לגרום נזק...
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 23 July 2007 בשעה 20:51 | | IP רשוּם
|
|
|
|
בקצב הזה אני יכול להגיד שאתה פשוט יכול לכתוב ולקרוא מכתובת קבועה כמות מסויימת של מילים וזהו...
השאלה התייחסה להחזרת מערכים מפונקציות באופן כללי, וכך גם התשובה. להתחכם אפשר עד אינסוף.
|
חזרה לתחילת העמוד |
|
|