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

Slides:



Advertisements
Similar presentations
Dynamic Allocation and Linked Lists. Dynamic memory allocation in C C uses the functions malloc() and free() to implement dynamic allocation. malloc is.
Advertisements

Data Structures: Doubly Linked List1 Doubly linked list l The linear linked list is accessed from the first node each time we want to insert or delete.
Files 1 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015.
מבוא למדעי המחשב לתעשייה וניהול
מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
Growing Arrays in C By: Victoria Tielebein CS 265- Spring 2011.
Agenda  Review: pointer & array  Relationship between pointer & array  Dynamic memory allocation.
הרצאה 04 הקצאות דינאמיות קרן כליף.
קורס תכנות שיעור שנים-עשר: ניהול זיכרון 1. הקצאת זיכרון דינאמית עד עכשיו עשינו "הקצאה סטטית" הגדרנו את משתני התוכנית כבר כשכתבנו אותה הקומפיילר הקצה עבורם.
הקצאות דינאמיות קרן כליף.
מבוא למדעי המחשב מערכים.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
תוכנה 1 - חזרה שולי לב יהודי 2 Arrays and Strings מערך - אוסף משתנים בעלי שם משותף. הפנייה לכל איבר נעשית ע ” י אינדקס. ב -C מערך מוגדר.
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכות הפעלה ( אביב 2009) חגית עטיה ©1 מערכת קבצים log-structured  ה log הוא העותק היחיד של הנתונים  כאשר משנים בלוק (data, header) פשוט כותבים את הבלוק.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
1 מבוא למדעי המחשב ארגומנטים לתוכנית בזמן ריצה קבצים הקדם מעבד Preprocessor טיפוסים סדורים Enumerated Types Typedef.
מודל הלמידה מדוגמאות Learning from Examples קלט: אוסף של דוגמאות פלט: קונסיסטנטי עם פונקציה f ב- C ז"א קונסיסטנטי עם S ז"א מודל הלמידה מדוגמאות Learning.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
לולאות 02 יולי יולי יולי 1502 יולי יולי יולי 1502 יולי יולי יולי 15 1 Department of Computer Science-BGU.
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
מודל הלמידה מדוגמאות Learning from Examples קלט: אוסף של דוגמאות פלט: קונסיסטנטי עם פונקציה f ב- C ז"א קונסיסטנטי עם S ז"א.
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
פוינטרים ומבנים. אתחול והדפסת מערך #include int * readArray(int size){ int *a, i; a= (int *) malloc (size* sizeof(int)); if (!a) return NULL; for (i=0;i
מבוא למדעי המחשב תרגול 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.
- אמיר רובינשטיין מיונים - Sorting משפט : חסם תחתון על מיון ( המבוסס על השוואות בלבד ) של n מפתחות הינו Ω(nlogn) במקרה הגרוע ובממוצע. ניתן לפעמים.
ECE 103 Engineering Programming Chapter 47 Dynamic Memory Alocation Herbert G. Mayer, PSU CS Status 6/4/2014 Initial content copied verbatim from ECE 103.
קורס תכנות שיעור שמיני: הקצאת זיכרון דינאמית, הצצה לייצוג ועיבוד תמונות 1.
CSCI 171 Presentation 5. The while loop Executes a block as long as the condition is true general form: while (condition) { statement 1; statement 2;
Introduction to Computer Organization & Systems Topics: C arrays C pointers COMP Spring 2014 C Part IV.
Computer programming Outline Arrays [chap 7 – Kochan] –The concept of array –Defining arrays –Initializing arrays –Character.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
Print Row Function void PrintRow(float x[ ][4],int i) { int j; for(j=0;j
Arrays and Pointers (part 2) CSE 2031 Fall March 2016.
1 Agenda Arrays: Definition Memory Examples Passing arrays to functions Multi dimensional arrays.
BIL 104E Introduction to Scientific and Engineering Computing Lecture 9.
Dynamic memory allocation and Intraprogram Communication.
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מערכים ומצביעים הקצאה דינאמית של מערכים דו-מימדיים
מיונים וחיפושים קרן כליף.
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
Dynamic memory allocation and Intraprogram Communication
הקצאות דינאמיות קרן כליף.
Introduction to Programming in C
מצביעים קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
מבוא כללי למדעי המחשב תרגול 6
מערכים של מצביעים הקצאה דינאמית
Programming in C תרגול Introduction to C - Fall Amir Menczel.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Arrays and Pointers (part 2)
Arrays and Pointers (part 2)
Presentation transcript:

1 מבוא למדעי המחשב הקצאה דינאמית

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

3 הקצאת זיכרון דינאמית - דוגמא מערך דו-ממדי: char month[13][15]={“illegal_month”,”January”,”February”,…,”December”} מערך של פוינטרים: char *pmonth[ ]={“Illegal”,”January”,”February”,…,”December”} illegal _ month\0 January F e b ruar y D ecem b er illegal _ month\0 January F e b ruar y D ecem b er

4 הקצאת זיכרון דינאמית בזמן ריצה  שימוש בפוינטרים.  הגדרת פוינטר בראשית הפונקציה – תופס רק את מספר הבתים המוקצים למצביע.  קביעת גודל הזיכרון אליו מצביע הפוינטר בזמן ריצה – כאשר ידוע גודל הזיכרון הדרוש.  הקצאת זיכרון ← ע"י הפונקציה malloc.  שחרור הזיכרון ← ע"י הפונקציה free.

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

6 הפונקציה free  הגדרת הפונקציה: void free (void *block)  הפונקציה מוגדרת ב-  הפונקציה משחררת את הבלוק המוקצה מן הזיכרון, כך שניתן יהיה להקצותו מחדש.  במידה ולא נפעיל את הפונקציה בסיום השימוש בבלוק, לא נוכל להשתמש בזיכרון שלא שוחרר במשך כל זמן ריצת התכנית. הזיכרון המוקצה ישוחרר ע"י מערכת ההפעלה בסיום ביצוע התכנית.

תכנית דוגמא /* malloc.c - a program demonstrating memory allocation */ #include int SetSize (void); int* CreateArray (int size); void PrintArray(int a[], int size); int main() { int i, len, *array; len=SetSize(); array=CreateArray(len); for (i=0; i< len; i++) array[i]=i; PrintArray(array, len); free(array); return 0; }

תכנית דוגמא int SetSize (void) { int size; printf("Please enter array size\n"); if (scanf("%d",&size)!=1){ printf("Error reading array size\n"); exit (1); } if (size<1){ printf("Array size too small\n"); exit (1); } return size; }

תכנית דוגמא int* CreateArray (int size) { int *array; array=(int *) malloc(size*sizeof(int)); if (array==NULL){ printf("Error in memory allocation\n"); exit (1); } return array; }

תכנית דוגמא void PrintArray(int a[], int size) { int i; for (i=0; i< size; i++) printf("%d ",a[i]); printf("\n"); return; }

11 תכנית דוגמא ( 2 ) – חיבור מטריצות  המטרה: לשנות את התכנית שכתבנו עבור חיבור מטריצות כך שתעבוד עם הקצאה דינאמית.  מעבר ממערך דו-ממדי למערך חד ממדי: row col 0 1 ן 01 j 01 … i*col+j

חיבור מטריצות – ללא הקצאה דינאמית int main() { int a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE]; int row1, row2, col1, col2; ReadMatrix(a, &row1, &col1); ReadMatrix(b, &row2, &col2); if (add(a,row1,col1,b,row2,col2,c)==FALSE) { printf("Matrices cannot be added\n"); return 0; } else{ printf("The result matrix:\n"); PrintMatrix(c,row1,col1); } return 0; }

חיבור מטריצות – עם הקצאה דינאמית int main() { int *a, *b, *c; int row1, row2, col1, col2; ReadMatrix(&a, &row1, &col1); ReadMatrix(&b, &row2, &col2); if (add(a,row1,col1,b,row2,col2,&c)==FALSE) { printf("Matrices cannot be added\n"); return 0; } else{ printf("The result matrix:\n"); PrintMatrix(c,row1,col1); } return 0; }

חיבור מטריצות – ללא הקצאה דינאמית /* read a matrix*/ void ReadMatrix (int a[SIZE][SIZE], int *row, int *col) { int i,j; printf("Please enter the number of rows and columns:\n"); if (scanf("%d%d",row,col)!=2){ printf("Input error"); exit (1); } CheckSize (*row); CheckSize (*col); printf("Please enter matrix [%d][%d]\n",*row,*col); for (i=0; i < *row; i++) { for (j=0; j < *col; j++) { if(scanf("%d", &(a[i][j]))!=1){ printf("Input error"); exit (1); } PrintMatrix(a, *row, *col); return; }

חיבור מטריצות – עם הקצאה דינאמית void ReadMatrix (int **a, int *row, int *col) { int i,j,place; printf("Please enter the number of rows and columns:\n"); if (scanf("%d%d",row,col)!=2){ printf("Input error"); exit (1); } CheckSize (*row); CheckSize (*col); *a=CreateArray((*row) * (*col)); printf("Please enter matrix [%d][%d]\n",*row,*col); for (i=0; i < *row; i++) { for (j=0; j < *col; j++) { place=i*(*col)+j; if(scanf("%d", *a+place)!=1){ printf("Input error\n"); exit (1); } PrintMatrix(*a, *row, *col); return; }

חיבור מטריצות – ללא / עם הקצאה דינאמית /* Check a matrix dimension*/ void CheckSize (int size) { if (size<0){ printf( “ Matrix dimensions should be positive\n"); exit (1); } return; }

חיבור מטריצות – ללא הקצאה דינאמית /* print a matrix */ void PrintMatrix (int a[SIZE][SIZE], int row, int col) { int i,j; printf("Printing matrix [%d][%d]\n", row, col); for (i=0; i < row; i++) { for (j=0; j < col; j++) { printf("%6d", a[i][j]); } printf("\n"); }

חיבור מטריצות – עם הקצאה דינאמית /* print a matrix */ void PrintMatrix (int a[], int row, int col) { int i,j,place; printf("Printing matrix [%d][%d]\n", row, col); for (i=0; i < row; i++) { for (j=0; j < col; j++) { place=i*col+j; printf("%6d", a[place]); } printf("\n"); }

חיבור מטריצות – ללא הקצאה דינאמית /* add two matrices */ int add (int a[SIZE][SIZE], int row1, int col1, int b[SIZE][SIZE], int row2, int col2, int c[SIZE][SIZE]) { int i,j; if ( (col1!=col2) || (row1!=row2) ) return FALSE; for (i=0; i < row1; i++) for (j=0; j < col2; j++) c[i][j]=a[i][j]+b[i][j]; return TRUE; }

חיבור מטריצות – עם הקצאה דינאמית /* add two matrices */ int add (int *a, int row1, int col1, int *b, int row2, int col2, int **c) { int i,j,place; if ( (col1!=col2) || (row1!=row2) ) return FALSE; *c=CreateArray((row1) * (col1)); for (i=0; i < row1; i++){ for (j=0; j < col1; j++){ place=i*col1+j; *(*c+place)=a[place]+b[place]; } return TRUE; }