מערכים של מצביעים הקצאה דינאמית

Slides:



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

הרצאה 04 הקצאות דינאמיות קרן כליף.
קורס תכנות שיעור שנים-עשר: ניהול זיכרון 1. הקצאת זיכרון דינאמית עד עכשיו עשינו "הקצאה סטטית" הגדרנו את משתני התוכנית כבר כשכתבנו אותה הקומפיילר הקצה עבורם.
הקצאות דינאמיות קרן כליף.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
תרגול מס' 2  העברת פרמטרים לתוכניות ב-C  קלט ופלט ב-C  I/O redirection  זיכרון דינמי  מצביעים  מערכים  גישות לא חוקיות לזיכרון.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תכנות תרגול 9 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מה החומר למבחן ? כל החומר שנלמד בהרצאות ובתרגולים. לגבי backtracking: לא תידרשו לממש אלגוריתם, אך כן להבין או להשלים מימוש נתון. אחת משאלות המבחן מבוססת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת.
תוכנה 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 מצביעים כמערכים דוגמה.
שיעור שישי: מערכים ופונקציות
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 14 שבוע : רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.
תרגול 2 העברת פרמטרים לתוכניות ב -C קלט ופלט ב -C I/O redirection זיכרון דינמי מצביעים מערכים גישות לא חוקיות לזיכרון.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
הגדרת משתנים יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר.
קורס תכנות שיעור שמיני: הקצאת זיכרון דינאמית, הצצה לייצוג ועיבוד תמונות 1.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מ- JAVA ל- C קרן כליף.
מערכים ומצביעים הקצאה דינאמית של מערכים דו-מימדיים
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
הקצאות דינאמיות קרן כליף.
שיעור שישי: מחרוזות, מצביעים
Introduction to Programming in C
מצביעים קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
מבוא כללי למדעי המחשב תרגול 4
מבוא כללי למדעי המחשב תרגול 6
מחרוזות קרן כליף.
Programming in C תרגול Introduction to C - Fall Amir Menczel.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Presentation transcript:

מערכים של מצביעים הקצאה דינאמית תרגול 11 מערכים של מצביעים הקצאה דינאמית

מערך של מצביעים כמו שניתן להגדיר מערך לכל טיפוס בשפת C, ניתן להגדיר גם מערך של מצביעים לדוגמא: אם נרצה לכתוב ברצף 4 משפטים קיימות בפנינו מספר אפשרויות (לפי מה שראינו עד כה): החזקת פוינטר נפרד לכל משפט char *s1 = “HELLO”; char *s2 = “How are you?”; char *s3 = “I am the longest line here!!!”; char *s4 = “THE END”; המשפטים לא יהיו ברצף!

מערך של מצביעים - המשך מערך דו מימדי של תווים: במערך תהינה 10 שורות, וכמה עמודות ? כמספר התווים במשפט הארוך ביותר \0 O L E H ? u o y e r a w ! h n i l t s g m I D N T פתרון סביר אך בזבזני במקום (בהנחה שיש משפטים הרבה יותר קצרים מהמשפט הארוך ביותר!)

מערך של מצביעים - המשך הפתרון: מערך של מצביעים מערך של 4 משפטים ייראה כך: char* message[] = { “HELLO!”, “How are you?”, “I am the longest line here!!”, “THE END”} “HELLO” “How are you?” “I am the longest line here!!” “THE END”

מערך של מצביעים - המשך תוכנית לדוגמא תוכנית המקבלת מערך של שמות (שם פרטי+שם משפחה) ויוצרת ממנו מערך של שמות המשפחה בלבד. חישבו מה הייתם משנים אם הייתם צריכים לקרוא את השמות מהמשתמש לתוך המערך names?

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

הקצאת זיכרון דינאמית - המשך לשם כך קיימות פונקציות להקצאה דינאמית של זיכרון, בזמן ריצה. כדי להשתמש בפונקציות אלו יש לכלול את הקובץ: stdlib.h

הקצאת זיכרון דינאמית - המשך פונקציה להקצאת זיכרון: void* malloc(unsigned size) הפונקציה malloc( ), מקצה רצף של size בתים ,ומחזירה מצביע לכתובת הבית הראשון, או NULL אם ההקצאה לא הצליחה. המצביע שהפונקציה מחזירה הוא מטיפוס void*, כלומר מצביע מטיפוס לא ידוע, ולכן צריך לבצע המרה של המצביע לטיפוס הרצוי.

הקצאת זיכרון דינאמית - המשך חשוב לזכור : לאחר כל הקצאת זיכרון צריך לבדוק שההקצאה הצליחה. לא תמיד הקצאות זיכרון מצליחות, מכיוון שזה תלוי במקום הרצוף הפנוי שמערכת ההפעלה יכולה לתת לנו- אם מערכת ההפעלה לא תוכל להקצות את המקום הנחוץ, ואנו ננסה להשתמש בו זו תהיה גישה לכתובת לא חוקית והתוכנית "תעוף" בזמן ריצה כדי לבדוק אם ההקצאה הצליחה בודקים אם המצביע שונה מ-NULL

הקצאת זיכרון דינאמית - המשך חשוב לזכור : לאחר כל הקצאת זיכרון צריך לבדוק שההקצאה הצליחה. לא תמיד הקצאות זיכרון מצליחות, מכיוון שזה תלוי במקום הרצוף הפנוי שמערכת ההפעלה יכולה לתת לנו- אם מערכת ההפעלה לא תוכל להקצות את המקום הנחוץ, ואנו ננסה להשתמש בו זו תהיה גישה לכתובת לא חוקית והתוכנית "תעוף" בזמן ריצה כדי לבדוק אם ההקצאה הצליחה בודקים אם המצביע שונה מ-NULL

הקצאת זיכרון דינאמית - המשך נניח שרוצים להקצות מערך של 50 מספרים שלמים: int *p; p = malloc(50*sizeof(int)); (int*) המרה מ(void*) מספר בתים

הקצאת זיכרון דינאמית - המשך נניח שרוצים להקצות מערך של 50 מספרים שלמים: int *p; if ( p = (int*)malloc(50*sizeof(int)) == NULL) { printf(“Allocation failed\n”); return 1; /* exit(1) */ }

הקצאת זיכרון דינאמית - המשך אחרי שמקצים זכרון צריך לשחרר אותו void free(void* ptr) הפונקציה free מקבלת מצביע לכתובת בזכרון ומשחררת את הזכרון שהוקצה מכתובת זו. למשל: free(p);

דוגמא – הקצאת מערך חד מימדי בפונקציה #include <stdio.h> #include <stdlib.h> #define INPUT 0 #define MEMORY 1 int get_array_size(void); /* get the array size from the user */ void create_array(int**, int) /* create the array */ void read_array(int* , int); /* read numbers into the array */ void print_array(int* , int); /* print the array */ void error(int); /* print an error message */

דוגמא – הקצאת מערך חד מימדי int main( ) { int *arr, size; size = get_array_size( ); create_array(&arr,size); read_array(arr,size); print_array(arr,size); free (arr); return 0; }

דוגמא – הקצאת מערך חד מימדי void create_array(int** a, int size) { if((*a = (int*)malloc(size*sizeof(int))) == NULL) error(MEMORY); return; }

דוגמא – הקצאת מערך חד מימדי void print_array (int a[],int size) { int i; printf(“\nThe array is : \n”); for (i=0;i<size-1;i++) printf(“%d ,”,a[i]); printf(“%d\n”,a[size-1]); return; } void error (int type) switch(type) { case INPUT: printf("Input error!!!! "); break; case MEMORY: printf("memory allocation failed"); exit (1); int get_array_size( ) { int size; printf("\nHow many numbers do you want to write ? \n"); if (scanf("%d",&size)!=1) error(INPUT); return size; } void read_array(int a[], int size) int i; for (i=0 ; i<size ; i++) if (scanf("%d",&a[i])<1) return;

הקצאה דינאמית של מערך דו מימדי הקצאה כמערך חד-מימדי – כמו שראיתם בהרצאה הקצאה כמערך של מערכים

הקצאה דינאמית של מערך דו מימדי ייצוג מערך דו-מימדי כמערך של מערכים: Matrix : מערכים המייצגים כל אחד שורה מערך של מצביעים – כל מצביע מצביע לשורה המתאימה

הקצאה דינאמית של מערך דו מימדי כדי להקצות דינאמית מערך דו-מימדי (למשל של מס' שלמים) כמערך של מערכים צריך: להקצות מערך חד מימדי של מצביעים (המערך המאונך בציור) להקצות מערך חד-מימדי עבור כל שורה, כך שעל כל שורה יצביע המצביע המתאים מהמערך שהקצנו בסעיף 1. וזה הקוד שעושה זאת: למערך של המצביעים נקרא matrix, והוא יהיה מסוג int** (מצביע למצביע למס' שלם) ונניח כי במשתנים row ו-col יש לנו את מימדי המטריצה אותה אנו רוצים להקצות. int row,col,i; int** matrix; … matrix = (int**)malloc(row*sizeof(int*)); if(matrix==NULL) { printf(“Allocation failed\n”); return 1; } for(i=0;i<row;i++) matrix[i] = (int*)malloc(col*sizeof(int)); if(matrix[i]==NULL)

הקצאה דינאמית של מערך דו מימדי בפונקציה אם נרצה לעשות את ההקצאה בפונקציה נפרדת, זה אומר שאנחנו צריכים להציב ערך במשתנה matrix לא באותה פונקציה בה הוא מוגדר, אלא בפונקציה שונה. הצבת ערך בתוך משתנה שהוגדק בפונקציה אחרת יכולה להתבצע בשתי דרכים (בדיוק כמו שלמדנו כשהתחלנו לדבר על מצביעים): בעזרת מצביע לאותו משתנה (ושליחת הכתובת שלו לפונקציה) להחזיר את הערך שרוצים להציב כערך מוחזר מהפונקציה בעזרת מצביע: המשתנה שבו אנחנו רוצים להציב ערך בפונקציה הוא matrix (הערך שאנו רוצים להציב הוא הכתובת ש-malloc מחזיר לנו). מאחר ו-matrix הוא מטיפוס int** אז מצביע אליו יהיה מטיפוס int*** והפונקציה תיראה כך: void mymalloc( int*** m, int row, int col) { int i; (*m) = (int**)malloc(row*sizeof(int*)); for(i=0;i<row;i++) (*m)[i] = (int*)malloc(col*sizeof(int)); return; } הקריאה לפונקציה תהיה: mymalloc(&matrix,row,col); וכמובן להוסיף בדיקות שההקצאה הצליחה

הקצאה דינאמית של מערך דו מימדי בפונקציה בעזרת ערך מוחזר: הפונקציה תיראה כך: int** mymalloc(int row, int col) { int**m; int i; m = (int**)malloc(row*sizeof(int*)); for(i=0;i<row;i++) m[i] = (int*)malloc(col*sizeof(int)); return m; } הקריאה לפונקציה תהיה: matrix = mymalloc(row,col); [זה יעבוד בגלל שהזיכרון שקיבלנו מ-malloc נשאר עד סוף התוכנית. צריך לזכור לשחרר אותו כשלא צריך אותו יותר.]

הקצאה דינאמית של מערך דו מימדי בפונקציה לאחר הקצאה כמערך של מערכים השימוש במערך הדו-מימדי יהיה בדיוק באותו אופן בו השתמשנו כשהמערך הוגדר סטטית. כלומר: matrix[i][j]