תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי

Slides:



Advertisements
Similar presentations
מבוא למדעי המחשב לתעשייה וניהול
Advertisements

Agenda  Review: pointer & array  Relationship between pointer & array  Dynamic memory allocation.
קורס תכנות שיעור שנים-עשר: ניהול זיכרון 1. הקצאת זיכרון דינאמית עד עכשיו עשינו "הקצאה סטטית" הגדרנו את משתני התוכנית כבר כשכתבנו אותה הקומפיילר הקצה עבורם.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
תרגול מס' 2  העברת פרמטרים לתוכניות ב-C  קלט ופלט ב-C  I/O redirection  זיכרון דינמי  מצביעים  מערכים  גישות לא חוקיות לזיכרון.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
1 מבוא למדעי המחשב משתנים. 2  סוגי משתנים בשפת C  ההבדלים בין סוגי המשתנים השונים.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
מה החומר למבחן ? כל החומר שנלמד בהרצאות ובתרגולים. לגבי backtracking: לא תידרשו לממש אלגוריתם, אך כן להבין או להשלים מימוש נתון. אחת משאלות המבחן מבוססת.
רקורסיות נושאי השיעור מהן רקורסיות פתרון רקורסיות : שיטת ההצבה שיטת איטרציות שיטת המסטר 14 יוני יוני יוני 1514 יוני יוני יוני 1514.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
תכנות תרגול 9 שבוע : מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך.
תוכנה 1 - חזרה שולי לב יהודי 2 Arrays and Strings מערך - אוסף משתנים בעלי שם משותף. הפנייה לכל איבר נעשית ע ” י אינדקס. ב -C מערך מוגדר.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תרגול 2 העברת פרמטרים לתוכניות ב -C קלט ופלט ב -C I/O redirection זיכרון דינמי מצביעים מערכים גישות לא חוקיות לזיכרון.
ערכים עצמיים בשיטות נומריות. משוואה אופינית X מציין וקטור עצמי מציינת ערך עצמי תואם לוקטור.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
משטר דינמי – © Dima Elenbogen :14. הגדרת cd ו -pd cd - הזמן שעובר בין הרגע שראשון אותות הכניסה יוצא מתחום לוגי עד אשר אות המוצא יוצא מתחום.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות תרגול 4 שבוע : לולאות for לולאות for for (counter=1 ;counter
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
Markov Decision Processes (MDP) תומר באום Based on ch. 14 in “Probabilistic Robotics” By Thrun et al. ב"הב"ה.
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 7 ISP דוגמא נוספת.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Sscanf example #include int main () { char sentence []="Rudolph is 12 years old"; char str [20]; int i; sscanf (sentence,"%s %*s %d",str,&i); printf ("%s.
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
Lecture 13 Static vs Dynamic Memory Allocation
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
קורס תכנות שיעור שמיני: הקצאת זיכרון דינאמית, הצצה לייצוג ועיבוד תמונות 1.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
Programming Arrays.
מבוא למדעי המחשב לתעשייה וניהול
מבוא למדעי המחשב סיבוכיות.
Programming Languages and Paradigms
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
קורס תכנות – סמסטר ב' תשס"ח
הקצאות דינאמיות קרן כליף.
Introduction to Programming in C
מצביעים קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
מבוא כללי למדעי המחשב תרגול 6
סוגי משתנים קרן כליף.
מערכים של מצביעים הקצאה דינאמית
Programming in C תרגול Introduction to C - Fall Amir Menczel.
Dynamic Memory Allocation
תוכנה 1 תרגול 13 – סיכום.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
EENG212 – Algorithms & Data Structures Fall 07/08 – Lecture Notes # 5b
C Programming Lecture-8 Pointers and Memory Management
Presentation transcript:

תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי

2-3/6/02Software 1 - Shuly Lev-Yehudi2 Multiple Indirection (Pointers to Pointers) addressvalue address value Pointer Variable Pointer Variable Single Indirection Multiple Indirection

2-3/6/02Software 1 - Shuly Lev-Yehudi3 Multiple Indirection (cont.) הגדרת מצביע למצביע : ; float **newbalance  newbalance אינו מצביע למספר floating-point אלא מצביע למצביע ל - float. כדי לגשת לערך עצמו יש להפעיל את אופרטור ה -* פעמיים : int x, *p, **q; x = 10; p = &x; q = &p; printf(“%d”, **q); /* print the value of x */

2-3/6/02Software 1 - Shuly Lev-Yehudi4 Initializing Pointers אחרי שמצביע הוגדר אך לפני שהושם לו ערך, הוא מכיל ערך לא ידוע (“ זבל ”).  אם ננסה להשתמש במצביע לפני שיש לו ערך “ חוקי ”, סביר שהתכנית תעוף ( וכנראה גם מערכת ההפעלה )! מוסכמה : מצביע שכרגע אינו מצביע למיקום בר - תוקף בזיכרון, מאותחל ל - null ( שהוא 0). מצביע שערכו null אינו מצביע לכלום. נשתמש בערך null כדי לציין למשל, סוף של מערך של מצביעים.

2-3/6/02Software 1 - Shuly Lev-Yehudi5 Initializing Pointers (cont.) Search (char *p[], char *name) { register int i; for (i=0; p[i]; ++i) if (!strcmp(p[i], name)) return; return -1; } כאן, ערך null מציין את סוף המערך. הלולאה רצה כל עוד לא נמצא name ולא הגענו למצביע שערכו null.

2-3/6/02Software 1 - Shuly Lev-Yehudi6 Initializing Pointers (cont.) ניתן לאתחל מצביע ל - char במחרוזת כאילו שהוא מערך : char *p = “hello world”; ה - compiler שומר את כל קבועי המחרוזות ב - string table ולכן הפקודה תכניס ל -p את הכתובת של הקבוע “hello world” כפי שהוא מאוחסן ב - string table.

2-3/6/02Software 1 - Shuly Lev-Yehudi7 Pointers to Functions למרות שפונקציה אינה משתנה, יש לה מקום פיזי בזיכרון שניתן לשמור אותו במצביע. כתובת של פונקציה היא נקודת הכניסה לפונקציה ולכן ניתן להשתמש במצביע לפונקציה כדי לקרוא לה. כתובת של פונקציה היא שם הפונקציה ללא סוגריים או ארגומנטים ( בדומה לכתובת של מערך ). דוגמא :

2-3/6/02Software 1 - Shuly Lev-Yehudi8 Pointers to Functions(cont.) void check (char *a, char *b, int (*cmp)(const char *, const char *)); void main(void) { char s1[80], s2[80]; int (*p)(const char *, const char *); p = strcmp; gets(s1); gets(s2); check(s1, s2, p); } void check (char *a, char *b, int (*cmp)(const char *, const char *)) { printf(“testing for equality\n”); if (!(*cmp)(a,b)) printf(“equal”); else printf(“not equal”); } הביטוי (cmp)(a,b*) קורא ל -strcmp. ניתן לקרוא ל -check גם כך : check(s1, s2, strcmp);

2-3/6/02Software 1 - Shuly Lev-Yehudi9 Dynamic Allocation Functions ה קצאה דינמית - הקצאת שטח בזמן ריצה. זיכרון דינמי מוקצה על ה - heap - שטח הנמצא בין התכנית והשטח הקבוע שלה (data), לבין ה - stack. פונקציות עיקריות : malloc - מקצה שטח, free - משחררת. צריך את השורה : include stdlib.h # prototype: void *malloc(size_t number_of_bytes); מחזירה מצביע ל - void שפרושו שניתן לשים את הערך החוזר במצביע מכל סוג שהוא.

2-3/6/02Software 1 - Shuly Lev-Yehudi10 Dynamic Allocation Functions (cont.) בהצלחה - מוחזר מצביע ל - byte הראשון בשטח שהוקצה. בכשלון - כאשר אין מספיק מקום - מוחזר null. לדוגמא : ; char *p p = malloc(1000);  אין צורך ב - cast, הערך מוסב אוטומטית לפי ה -type בצד שמאל ( ב -++C לא נעשית הסבה אוטומטית !). הקצאת 50 integers. ה -sizeof נחוץ ל -portability: int *p; p = malloc(50 * sizeof(int));

2-3/6/02Software 1 - Shuly Lev-Yehudi11 Dynamic Allocation Functions (cont.)  יש לבדוק האם הערך החוזר אינו null! free מחזירה למערכת שטח שהוקצה קודם. prototype: void free(void *p); p הוא מצביע לשטח שהוקצה קודם.  חשוב לא לקרוא ל - free עם ארגומנט לא נכון !

2-3/6/02Software 1 - Shuly Lev-Yehudi12 Problems with Pointers שימוש בערך לא טוב של מצביע יכול לגרום לכתיבה לשטח אחר. טעויות נפוצות :  uninitialized pointer: /* this program is wrong */ void main(void) { int x, *p; x = 10; *p = x; } p לא אותחל ולכן הערך 10 נכתב במקום לא ידוע בזיכרון. הבעיה משמעותית בתכנית גדולה.

2-3/6/02Software 1 - Shuly Lev-Yehudi13 Problems with Pointers (cont.)  Misunderstanding of how to use a pointer: /* this program is wrong */ void main(void) { int x, *p; x = 10; p = x; printf(“%d”, *p); } printf לא תדפיס את הערך 10 אלא ערך כלשהו אחר. לתיקון יש לכתוב : p = &x;

2-3/6/02Software 1 - Shuly Lev-Yehudi14 Problems with Pointers (cont.)  Incorrect assumptions about variables locations: אי אפשר לדעת היכן המשתנים ממוקמים בזיכרון. לכן אם ננסה להשוות בין מצביעים שאינם מצביעים לאובייקט משותף, נקבל תוצאה לא צפויה : char s[80], y[80]; char *p1, *p2; p1 = s; p2 = y; if (p1 < p2)... לא נכון להניח ש - s ו -y מוקצים ברצף.

2-3/6/02Software 1 - Shuly Lev-Yehudi15 Problems with Pointers (cont.) באותו אופן לא נכון לאתחל את המערכים first ו - second במספרים 0 עד 19 ( למרות שבחלק מה - compilers זה יעבוד ): int first[10], second[10]; int *p, i; p = first; for (i=0; i < 20; i++) *p++ = i;