לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 28-04-2009, 18:17
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
C - קימפול קבצים רבים + קריאה לקבוע בקובץ אחר

אני רוצה ליצור ספרייה אישית שאאנקלד אותה מתי שאצטרך.

אחרי חיפושים הגעתי לעמוד הבא: http://www.ctp.bilkent.edu.tr/~fenmen/bim201/func3.htm
קראתי ופעלתי לפי מה שכתוב, אבל יש שגיאות שקבוע מסויים לא מוגדר. את הקבוע הגדרתי בקובץ X, והשתמשתי בו בקובץ Y.

קודם כל, אלה הקבצים:
13.c
pe.c
pe.h

כפי שניתן לראות, בקובץ 13.c הגדרתי בעזרת define קבוע ששמו pep_id.
בקבוע הזה השתמשתי בקובץ pe.c.

אבל כאשר אני מריץ את פקודת המעטפת הבאה (דרך Notepad++):
קוד:
"C:\Soft\Dev-Cpp\bin\gcc.exe" -Wall 13.c pe.c -o "$(CURRENT_DIRECTORY)\$(NAME_PART)"

(את סקריפט הקימפול הבנתי מכאן )


אני מקבל את השגיאה:
ציטוט:
pe.c: In function `pe_wFile':
pe.c:12: error: `pep_id' undeclared (first use in this function)
pe.c:12: error: (Each undeclared identifier is reported only once
pe.c:12: error: for each function it appears in.)


מה עשיתי לא בסדר?

תודה !
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 30-04-2009, 00:05
  Incred2 Incred2 אינו מחובר  
 
חבר מתאריך: 03.01.09
הודעות: 239
בתגובה להודעה מספר 10 שנכתבה על ידי dorM שמתחילה ב "קראתי הכל :/ הפיתרון שאני..."

אין פה שום בלבול .
אתה ממציא ויוצר לעצמך בלבול במקום שהוא לא קיים .

הטיפול ב DEFINE וב INCLUDE נעשה ב PREPROCESSOR .זה דבר אחד .הקימפול של קבצי קוד מקור נעשה בקומפיילר .זה דבר נפרד לגמרי .הקישור נעשה בלינקר .זה דבר שלישי ונפרד .זה המודל של שפת C .שאתה בוחר להתעלם ממנו אתה יוצר לעצמך בלבולים שלא קיימים .

ולכן דבר ראשון
ציטוט:
במקור נכתב על ידי dorM
זה קצת מבלבל להבין כיצד הקומפיילר מתייחס לקבצי header ו-source עם הגדרות extern וכו'

הקומפיילר לא מתייחס לקבצי HEADER בשום צורה .הוא לא מכיר אותם .הקומפיילר הוא כלי שיכול לקמפל קובץ SOURCE בודד .זה הכל ולא יותר מזה .

דבר שני
מה זה extern ?
בגדול כדי שתוכל להשתמש במשתנה או בפונקציה אתה חייב להצהיר ( DECLARE ) עליו בקובץ הקוד שלך והוא חייב להיות מוגדר ( DEFINED ) באחד מקבצי ה OBJ שאתה הולך ללנקג' .הגדרה של פונקציה זה לכתוב את הקוד שלה והצהרה על פונקציה זה לכתוב את ה PROTOTYPE שלה .לגבי משתנים כשאתה כותב טיפוס ושם משתנה זוהי הגדרה .ולכן אם אתה רוצה להשתמש בכמה קבצי SOURCE באותו משתנה אתה לא רוצה לכתוב טיפוס ושם משתנה כי זה יהיה ניסיון להגדיר משתנים חדשים ולא להשתמש באותו משתנה .מה שאתה אמור לעשות זה להצהיר על משתנה שמוגדר באיזה מקום אחר .זה מה שעושה extern .מצהיר על שימוש במשתנה שמוגדר השד יודע איפה .

וזה מוביל אותנו לעניין השלישי
ציטוט:
במקור נכתב על ידי dorM
העניין הוא שבכל הקבצים שאני רוצה להשתמש במשתנה pep_id, אני צריך לכלול את קובץ ה-header שאומר שהוא extern.

זה טיעון בכיינות פשוט טיפשי .בשפת מוגדר שכדי שקימפול של קובץ SOURCE יצליח כל חייבות להימצא בו הצהרות לכל המשתנים והופונקציות שמוזכרות בו .במקום לעשות INCLUDE ל HEADER אתה יכול גם להעתיק את אותה שורה שוב ושוב אם אתה חושב שזה יותר נוח .....
אתה בוכה על זה שבכל קובץ שאתה רוצה להשתמש בו ב PRINTF אתה צריך לעשות INCLUDE ל STDIO ? אז למה לבכות על זה שבכל קובץ שאתה רוצה להשתמש בו במשתנה PEP_ID צריך לעשות INCLUDE לאיזה קובץ אחר ?

לקראת סיום נאמר שאת המשפט הבא אני פשוט לא מבין
ציטוט:
במקור נכתב על ידי dorM
אם לא הייתי נותן הגדרת extern? הרי זה כביכול נראה שקבצי header נועדו להכיל מידע של extern בכל מקרה, אז למה צריך להגדיר את זה מההתחלה?

קבצי H נועדו להכיל טקסט שאתה רוצה לכתוב במספר קבצים כדי לחסוך לך הקלדה .מה זה " מידע של EXTERN " אני ממש לא יודע

ולבסוף
ציטוט:
במקור נכתב על ידי dorM
קראתי הכל :/

אולי את כל הדף הזה קראת אבל זה שאתה לא מבין את ההבדל בין CONST לבין DEFINE מראה שהרבה חומר הרבה יותר בסיסי לא קראת .אתה לא מרגיש שהגיע הזמן להשיג ספר בסיסי על C ולקרוא אותו מההתחלה ועד לסוף ? אני בטוח שתוכל למצוא את THE C PROGRAMMING LANGUAGE במקום כזה או אחר .
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 20:36

הדף נוצר ב 0.09 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר