Lecture 3

  • Uploaded by: Baseem Najjar
  • 0
  • 0
  • April 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Lecture 3 as PDF for free.

More details

  • Words: 463
  • Pages: 6
‫מת"ם ‪3‬‬ ‫נדבר על‪ :‬מבנים והקצאה דינמית‬ ‫‪-1‬מבנים – ‪STRUCT‬‬ ‫נרצה להגדיר מה זה סטודנט מבחינת מרצה בקורס מת"ם‪:‬‬ ‫–שם פרטי‬ ‫–שם משפחה‬ ‫–תעודת זהות‬ ‫–ציון תרגילי בית‬ ‫–ציון מבחן‬ ‫–ציון סופי‬ ‫מה זה סטודנט מבחינת פרופ" לרפואה‪:‬‬ ‫–שם‬ ‫–כרטיס אשראי‬ ‫–מחלה‬ ‫–עבר רפואי‬ ‫איך נגדיר סטודנט במת"ם בספת ‪? C‬‬ ‫{‪typedef struct student‬‬ ‫;]‪char 1name [20‬‬ ‫;]‪char 2name[30‬‬ ‫;‪long id‬‬ ‫;‪float HW_grade‬‬ ‫‪char EXAM_grade; //char a number between 0‬‬‫‪255 - enough‬‬ ‫;‪char final_grade; } Tel_Hai_Student‬‬ ‫סיכום ‪:1‬‬

: typedef ‫ניתן להגדיר סוגים חדשים של משתנים ע"י שימוש ב‬ typedef

‫שם חדש‬

typedef

int

‫סוג‬ new_int;

new_int new // same as int new; ‫דוגמה‬ #include <stdio.h> typedef struct student{ …

‫אותם השדות יופיעו פה‬ {Tel_Hai_Student;

void main() { Tel_Hai_Student moshe; Tel_Hai_Student *olga; Tel_Hai_Student arr_stud[15]; moshe.Exam_grade=100; //‫ישנה את הציון של משה ל‬ 100 Arr_stud[2].HW_grade=30; (*olga).Exam_grade=100; (‫)כתיבה שקולה‬

olga->Exam_grade=100; ?‫מה קורה בזכרון בעת הגדרת המבנה‬ ‫נניח הגדרנו‬

Tel_Hai_Student moshe;

‫מקצה מקום בזכרון בגודל סה"כ גודל השדות‬ 20*1byte + 30*1byte + 4byte + … + 1byte Name1

name2

final_grade ‫ בתים‬60 ‫סה"כ מקצה‬

Tel_Hai_Student *olga; 4byte ‫מקצה‬ :‫שימו לב‬ ‫כאשר מגדירים‬ Type *name; ‫( בתים‬sizeof(int ‫ הוא מוגדר להיות כתובת עבורו מוקצה‬Name :‫למשל‬ Int* int_name; ‫ בתים כי זה פוינטר למשל‬4 ‫מוקצה‬ Char *char_name; // ‫ בתים כי זה פוינטר‬4 ‫גם מוקצה‬ Tel_Hai_Student *THS_name; // ‫ בתים כי זה פוינטר‬4 ‫גם מוקצה‬ :‫נסתכל על הדוגמה עם הפרופ" לרפואה‬ typedef struct{ char *name; double credit_card_number; char* desease_name; struct past_condition{ //‫עבר רפואי‬ int num_of_red_balls;

…… } }student_for_doctor; union (‫ )איגוד‬:‫סוג נוסף של מבנה‬ typedef union { char c_val;  1byte char *str; 4byte float f_val;}union_type; 4byte union_type example;  ‫מוקצה זיכרון בגודל של השדה הגדול‬ ‫ביותר‬ 4byte ‫במקר שלנו יוקצה זכרון‬ example.c_val=7; example.f_val=8.2; :‫הקצאה דינמית‬ ?‫מתי משתמשים‬ :1 ‫דוגמה‬ #include.. void main() { int N; int arr[N];  ‫טעות‬ scanf(“N: %d”&N);

‫}‬ ‫!אי אפשר לעשות זאת כי זה נעשה בזמן ריצה‬ ‫כאשר צריך להקצות מקום בגודל שלא ידוע לפני ריצת התוכנית‬ ‫משתמשים בהקצאה דינמית‪.‬‬ ‫ישנן ‪ 4‬פונקציות המנהלות הקצאה דינמית ושחרור של הזכרון‬ ‫‪(memory allocation) malloc‬‬ ‫)‪void* malloc(size‬‬ ‫אופן הפעולה – מבקשת ממערכת הפעלה מספר בתים השווה ל‪-‬‬ ‫‪ SIZE‬מחזירה פוינטר להתחלת שטח הזכרון שמצאה או ‪ NULL‬אם‬ ‫נכשלה‬ ‫דוגמה‪:‬‬ ‫;‪char* line‬‬ ‫הקצה עבורו מקום בגודל ‪ 80‬בתים ‪line = (char *)malloc(80); ‬‬ ‫) ‪( casting‬‬ ‫דרך אחרת‪:‬‬ ‫;))‪line= (char *)malloc(80*sizeof(int‬‬ ‫‪ byte320‬יוקצה‬ ‫‪calloc:‬‬ ‫‪void *calloc(N , S) ‬‬ ‫‪ – N‬מס האלמנטים‬ ‫‪ – S‬גודל של כל אלמנט‬ ‫זהה ל ‪ MALLOC‬רק שהיא מאפסת את המערך‬

‫מקצה מחדש שטח ‪void *realloc(void *block, int size); ‬‬ ‫בזכרון‬ ‫פעולה יקרה ‪ -‬יש להשתמש בה כמה שפחות‬ ‫כתובת התחלת הבלוק הישן – ‪void *block‬‬ ‫הגודל החדש שנדרש – ‪int size‬‬ ‫פעולה אחרונה‪FREE :‬‬ ‫פונקציה משחררת את הזכרון שהוקצה‬ ‫להיזהר עם ‪ – FREE‬לא לשחרר פעמיים את אותו הפוינטר – לא‬ ‫האם‬ ‫לבדור‬ ‫תמיד‬ ‫–‬ ‫‪NULL‬‬ ‫שהוא‬ ‫פוינטר‬ ‫לשחרר‬ ‫‪ malloc/calloc/realloc‬הצליחו!‬

Related Documents

Lecture 3
June 2020 0
Lecture 3
November 2019 8
Lecture 3
June 2020 2
Lecture 3
November 2019 12
Lecture #3
June 2020 3
Lecture 3
June 2020 2

More Documents from ""

Lecture 2
April 2020 10
Questions 4
April 2020 9
Lecture 4
April 2020 18
Lecture 3
April 2020 12
Lecture 5
April 2020 19
9-borehole Seismic_lw.pdf
December 2019 8