אני מנסה לבנות מודול עבור Asterisk, ומה לעשות, מארק מאוד אוהב את שפת C כמו שהוא אמר לנו לפני קצת יתר משנה, אז הוא כתב את המרכזייה בשפת C.
כרגע כמה אנשים אומרים "נו הוא עוד פעם מתחיל, מה הוא לא מבין שהעולם מדבר ב C ?"
אז הנה קוד שכתבתי בשביל לעשות כמה נסיונות עם inotify:
for (int i = 0; i < MAX_LIST; i++)
…
עכשיו אחרי שהקוד כתוב צריך להדר נכון ? אז קיבלתי הודעת שגיאה אחת בלבד:
error: ‘for’ loop initial declaration used outside C99 mode
אם יש לכם ניסיון עם ההודעת שגיאה הזו, אנא תתעלמו ממה שאתם יודעים, ונראה אותכם מפרשים את ההודעה הזו בלי שימוש בגוגל…
מה אין מושג ?! נו, תנסו … קחו קצת זמן …מה לא ?!
בטוחים ?! טוב נו…
ובכן ההודעה הזו אומרת שהמהדר יושב כרגע על תחביר שהוא לא C99, מה שאומר ש int i בתוך ה for לא יתמך (כי הוא נוסף ב C99).
הבעיה כאן היא שההודעה כל כך עוזרת להבין את הבעיה, שלוקח למי שאינו מכיר אותה, הרבה זמן להגיע למצב שהוא מגלה איך לפתור… ד"א בשביל לפתור את הבעיה, צריך להוסיף את הפרמטר
-std=C99
בשורת הפקודה/Makefiel…
אפשר לחשוב ששפה ומהדר כל כך נפוצים לפחות יהיו ידידותיים למשתמשים שלו…
מה בדבר פתיחת פרוייקט לבינדינג לפסקל?
ולהתחיל לפחות עם הAPI שאתה משתמש למודל…
או שזה פרוייקט מורכב מאוד בעצמו…
כמובן שזה יגביל את המודל לסביבות שאסטריקס ניתן לקימפול…
נ.ב
מה דעתך על התקנת תוסף אופן ID?
קצת גדול עלי לעשות binding לפסקל לפרוייקט בסדר גודל של Asterisk ורמת השינויים העצומה שלו בין גרסה לגרסה… למרות שכמה וכמה מהאנשים שאני מכיר שמפתחים אפליקציות מעל אסטריסק בעולם, גם משתמש ב FPC, ואולי בסוף נראה מהם משהו…
היות ומעולם לא פיתחתי לא ל inotify ולא מודולים בC, אני עושה נסיונות לפני שאני עושה את הדבר האמיתי, בשביל להבין מה אני עושה כמובן 🙂
לגבי OpenID, למרות שאני לא בעדו, במידה וצוות בלוגלי יוסיפו תוסף כזה, אני מוכן לשקול בחיוב הוספה שלו.
"לגבי OpenID, למרות שאני לא בעדו, במידה וצוות בלוגלי יוסיפו תוסף כזה, אני מוכן לשקול בחיוב הוספה שלו."
אופס… שכחתי מעובדה זו….
אם אתה רוצה לכתוב C ולהיות פורטבילי, השתמש ב-Ansi C.
ב-Ansi C, אל תגדיר את ה-int i בתוך ה-for. כמו-כן תגדיר את כל המשתנים שלך בשורות הראשונות של הפונקציה בלבד לפני כל ביצוע פעולה אחרת. (קצת מרגיז אבל זה התקן)
איו לי בעיה לא להגדיר את המשתנה בתוך ה for, יש לי בעיה בזה שהמהדר לא נותן לי שום מידע יעיל שאני אבין את הבעיה…
אמנם הודעת השגיאה לקונית, אבל מי שיודע מה זה C99 אמור להבין אותה.
אני לא בטוח… אני אתן לך דוגמה דווקא מ FPC:
"You need ObjFpc (-S2) or Delphi (-Sd) mode to compile this module"
אתה יכול למצוא את כל ההודעות כאן
וכמו שאתה רואה, למרות שדברים אמורים להיות ברורים, עדיין ההודעה עוזרת לך להבין מה לא עשית בסדר…
בוא נשאל אותך ככה: יש לך מחשב קבוע שאתה מתכנת בו, ולכן יש לך הגדרה שאומרת שאתה משתמש ב C99 בכל מצב, ואתה עובר למחשב ללא הגדרה כזה, האם למרות שאתה מכיר את C99, יהיה לך פשוט להתמודד עם הודעות שגיאה בסגנון הזה ?
אם התוכנה מספיק חכמה כדי להגיד לך איזה דגל להוסיף, למה היא לא הוסיפה אותו בעצמה? ולמה היא לא אומרת לך כלום על הסיבה להוספה?
בכל מקרה, קצת בכיוון:
http://svn.digium.com/view/asterisk?view=rev&rev=102952
למה שהיא תעבור למצב הזה בעצמה ?! אם אתה לא מעוניין במצב הזה, היא לא יכולה לקרוא את הכוונות שלך, אבל לפחות היא מודיעה לך שאם אתה כן התכוונת, אז תשתמש באחד מהמצבים האלו.
בלי להתקל בבעיה של FPC למעלה, אני יכול לדעת בוודאות שמדובר בקוד שמדבר ב Object Oriented עם מחלקות (בניגוד לאובייקטים). והיות והקומפיילר גם נותן לא רק מספר שורה, אלא את המיקום הסופי של הבעיה, כלומר תו/עמודה 10 בשורה, אז מאוד קל להבין בייחד עם זה איפה הבעיה, הרבה יותר מGCC שנותן רק מספר שורה.
שים לב שGCC לא אומרת כלום פרט למילה C99. עכשיו מה אתה צריך ללמוד מזה ?! שאתה או לא מכיר מספיק טוב C99, או שהבעיה היא קשורה למשהו שלא נתמך בC99 או כל בעיה אחרת שהכותרת C99 מתאימה לה.
לדעתי הדיווח על שגיאות צריכות להיות כמה שיותר קריאות, ולא לצפות שתיבן מה הבעיה אם אני זורק קוד מסויים.
ובהמשך לאותו כיוון:
מתוך שיחה ב־#asterisk-dev
i'm doing it in such a way that extending it to (language of your choice) is really easy
if you want perl, php, whatever, i could have that with the same capabilities by tomorrow
assuming the language has a decent API for being embedded …
אני יכול להוכיח לך שזה לא נכון … אבל במקום זה נשאל אותך שאלה שאתה יודע לענות לבד ושתתן לך את התשובה: "כל כמה זמן אסטריסק מוציא גרסה חדשה, האם יש בה שינויים ולו הקלים ביותר ל API ?"
אם התשובה לשאלה היא לפחות אחת בחודש, ולפעמים, אז ממש לא קל ופשוט לעשות binding.
ועוד משהו מאוד חשוב שמעולם לא מצאתי, זה לאיזה ספריות אני צריך לקשר את עצמי בשביל להיות מודול של אסטריסק ? כנראה שאני צריך להתחיל לחקור את ה Makefile של הדברים הקיימים.