
04-03-2008, 23:11
|
|
|
|
חבר מתאריך: 30.07.05
הודעות: 949
|
|
אתה צריך להבין מה קורה מאחורי הקלעים...
דבר ראשון: מה זה מערך?
מערך זה למעשה בלוק של נתונים בזיכרון.
החלק החשוב הוא שמערך יושב כגוש אחד בזיכרון - בלוק. כל התאים מסודרים אחד אחרי השני כאיזור רציף בזיכרון.
מה שמגדיר מערך הוא 2 דברים:
1) נקודת ההתחלה
2) הגודל.
כאשר C מתעלם מהגודל ומאפשר לך בעצם גם לחרוג מגודל המערך, כלומר שומר רק את כתובת תחילת המערך.
כאשר אתה ניגש לתא מסויים במערך, לדוגמא 5, ה-C מתרגם זאת כ:
- גש לכתובת בזיכרון שבה מתחיל המערך
- ספור 5 גדלי תאים
- החזר את הערך שרשום בנקודה שהתקבלה בזיכרון.
למעשה המשתנה שלך - המערך - הוא מצביע, כתובת בזיכרון.
כשאתה עושה
למעשה המחשב מגדיר 2 תאים בזיכרון ומחזיר את הכתובת של הראשון מבינהים למשתנה a.
----
הפונק' printf לוקחת מחרוזת ומחליפה תתי-מחרוזות שמתחילות ב-% בערכים של משתנים שהיא מקבלת לפי הסדר.
תזכור שמשתנה הוא בסה"כ אוסף של ביטים - אפסים ואחדים. ניתן להסתכל על ערך מסויים, לדוגמא 110000 כעל הערך המספרי 48 או כעל תו '0' ההבדל הוא אם אתה כותב %d או %c.
לכן למעשה לא ממש איכפת למחשב מה אתה דוחף לשם - הוא בשלו יתרגם כמו שהוא יודע.
---
אז קודם כל & זה אופרטור הכתובת. הטעות שלך מובנת והיא נובעת מ-scanf שבאמת זקוק לכתובת של משתנה כדי לשנות את הערך שלו.
זה לא המצב עבור printf.
מה שלמעשה כותבת הפונק' printf המספר המוזר: 23454564 זה הכתובת בזיכרון של התא מספר 2 במערך שלך.
במשתנה שלך בזיכרון אולי רשום 2, אבל הכתובת שלו נמצאת אי-שם במרחב הזיכרון..
תוריד את סימן ה-& ותקבל ערך הגיוני.
בנוסף שים לב שיש לך 2 פלטים: %d%d אבל רק משתנה אחד...
מוזר שהפונק' לא קורסת לך.. אני משאר שהכוונה האמיתית שלך הייתה:
קוד:
printf("the numbers %d,%d\n", s[0], s[1]);
שים לב להבדל הקטן.
שיהיה בהצלחה!
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.
|