מת"ם נושא :עבודה עם מודולים
איך בונים בית? )1אדריכל :עושה תיכנון )2קבלן שלד )3קבלן תשתיות )4אנסטילציה )5צבע )6רצף )7זגג )8נגר זה בדיוק כמו ה mainשלנו ויש בו קריאות לשמונה פונקציות –כל פונקציה נמצאת בקובץ –קובץ ראשון mainשיש בו קריאה ל פונקציות אדריכל – פונקציה שני –קובץ architecture.c –קובץ שלישי – קבלן kablan_shetah.c : –קובץ רביעי... נרצא ליצור headerבתוכם נצהיר על הפונקציות הנמצאות בקבצי C ויכילו גם ספריות בהן נשתמש וכן מבנים – structומאקרואים שאלה :נניח יש לנו 2קבצי :H
אם נשים שני קבצים h1.hו h2.hואחד יקרא לשני אז זאת לא קריאה טובה כי יש תלות ביניהם יצרנו קבצי Cוקבצי Hמה עושים? קומפילציה של כל קבצי ה C ומקבלים קבצי )O )object בדוגמה עם בית יש לנו 9קבצי C אחרי הקומפילצי נקבל 9קבצי ( Oקבצים עם אותם השמות וסיומת )O שלב ניבא :ביצוע קישור LINK הלינקר מקשר את כל קבצי ה OBJECTלתוכנית אחת (כמו תוכנית המקבלת מקובץ יחיד) קובץ Cאחד יכול לבקש שימוש ביותר מקובץ Hאחד C1.h c2.h c3.h compiling c1.o c2.o c2.o linking c.exe כשיש בעיה ב HEADERלא תהיה בעיה בקומפילציה אלה ב LINKINGכי הואא זה שמקשר את ה HEADERלקבצי ה C תוכנית הבנויה ממספר קבצים – סיכום: יש חשיבות רבה לחלוקת תוכנית לקבצים – ויש לחלק למספר קבצים לא גדול מדי ולא קטן מדי חשיבות החלוקה – תוכניות גדולות בד"כ נכתבת ע"י כמה צוותים פונקיות נפרדות יכולות לשרת תוכניות שונות קל לתחזק ולשרת תוכנית כזאת -ניתן לקמפל רק קבצים שהשתנו (חוסך הרבה זמן)
הוראות קדם מעבד ()PP- PREPROCESSOR
)1לפני הקומפילצי מופעלת תוכנית שמעבדת את כבצח המקור )2הפקודות עבור PPמתחילות בסימן # !)3ההחלפה שנעשית ע"י ה PPהיא טקסטואלי (ניתן להפעיל PPעל קובץ טקסט) איזה פעולות מתחיות ב ?# include# define# …ifdef# הפקודה define#מאקרו >…<#include #define N 300 ”#define ERROR “NOT GOOD (#define FOREVER while)1 (’#define WAIT_FOR_ENTER while)getchar)( != ‘\n ()Void main { ;(Printf)ERROR
FOREVER { ;(”Printf)“Shadow\n ;WAIT_FOR_ENTER } } באופן כללי פעולת define#נראת כך: שדה 1שדה #define 2 שדה :1הטקסט שיוחלף שדה :2הטקסט שישובץ מומלץ להשתמש במאקרו – וגם להשתמש באותיות גדולות כדי שיהיה מובן במאקרו אפשר לרדת שורה ע"י שימוש ב \ דוגמה: \#define ERROR “NOT ”GOOD תוכנית: –קריאות –אין צורך להחליף ערך בתוכנית (כמו )N 300 מאקרו דוגמה (#define MAX)A,B( ))A>B(?A:B ניתן להתייחס ל Aן Bכאל ארגומנטים של פונקציה פשוטה ()Void main ;Int x
X=MAX)3,4(; } PP אחרי המעבר של Void main)( { Int x; X=))3>4(?3:4(; } :דוגמה נוספת #define SQR)X( x*x Int y; Float a=33; Y=)int(SQR)a( y=a*a; Casting העובר רק עלa הראשון 1 תיקון #define SQR)X( )X*X( Y=SQR)a+b( y=)a+b * a+b(; אבל זה לא מה שרצינו 2 תיקון #define SQR)X( ))X( * )X(( Int i=2; Y=SQR)I++( y=))++i(*)++i((
יגדיל את Iפעמיים מסקנה יש לעבוד בזהירות רבה עם המאקרואים –שים לב כי אין ב מאקרוז משתנים גלובאלים –ה PPמשבץ את הטקסט לקוד – מנפח אותו הוראת INCLUDE יכולים לכלול קבצי * H.בקובץ המקור >#include <stdio.h ”#include “myheader.h כלומר קובץ * c.יכלול את תוכן של הקובץ Hשאליו נעשה INCLUDE