פסקל רבותי פסקל...

Fingertip

New member
לא בכדי באמרתי שהדוגמה מלאכותית

1. אמרתי ששני התהליכים אינסופים, משמע אין פתאום return. 2. כבר אמרתי שזו דוגמה מלאכותית? אהד.
 

אלדד28

New member
מלאכותית = גרועה?

הדוגמה שהבאת היא לא מלאכותית, היא פשוט גרועה. ונתתי לך פיתרון טוב יותר בלי קשר ל-return באמצע.
 

eyalbd

New member
יש קפיצות ב-C

הכוונה ל setjmp ו- longjmp. אפשר לקרוא לזה non-local goto. זה לא ממש שימושי וב ++C אפילו לא רצוי. ע"י קריאה לsetjmp "מכינים את הקרקע" לקפיצה שומרים stack ועוד ענייני קומפיילרים. בקריאה מאוחרת יותר ל longjmp יש קפיצה שחורגת מגבולות של פונקציות תוך שיחזור המצב כפי שהיה בעת ההכנה. השימוש המקורי הוא בעיקר למקרים חריגים. המנגנון די דומה ל exceptions ב-++C. ב-++C עדיף תמיד להשתמש ב exceptions ע"פ קפיצות כאלה כי זה מובנה בשפה ויודע לקרוא לdestructors
 

Fingertip

New member
../images/Emo31.gif../images/Emo31.gif../images/Emo31.gif

קריאות מערכת/ספריה לא נחשב -- דיברנו על אמצעים שפתיים.
. אהד.
 

eyalbd

New member
זה לא system call

אבל זה חלק מהספריה הסטנדרטית של C. המימוש לא משתמש בקריאת מ"ה מיוחדת אלא %100 אסמבלי די פשוט.
 

eyalbd

New member
יש לך את זה ב RTL

יש את זה ב Runtime Library של MSVC וגם C++Builder תוכל לבדוק קובץ H בשם setjmp.h יש גם את csetjmp לספריית ++C הסטנדרטית
 

DNile

New member
האמת היא שזה לא מעוות כלל.

טוב, נו, זה כן :) אבל כבר קראתי איזה מאמר די מעניין על הפקודות האלה. יש כבוד.
 

DNile

New member
מימוש מנגנון exceptions כשאין CPP.

ולמיטב ידיעתי, זה גם חוסך הרבה מהOverhead שמוסיף Exceptions לקוד.
 

annefan

New member
הסבא של ה-exceptions

נכון שזה חוסך overhead, אבל הפעולה גם מאד פרימיטבית. ב-Exceptions יש stack-unrolling מסודר. כלומר, כל רמת קריאה משוחזרת, מנוקה אם צריך והחריגה מטופלת או שממשיכה לעלות כלפי מעלה. setjmp מצלמת מצב נתון. כשמגיעה longjmp היא משחזרת את ה-stack מה"צילום" וזהו. אין שום ניקוי מסודר של כל השלבים בדרך. ממילא אין תקורה...
 

אלדד28

New member
בלי הרבה קשר, אני לא ממש מבין את

האמרה הזו "...כשאין CPP". לאיזו מערכת הפעלה כיום אין קומפיילר נורמלי ל-CPP?
 

DNile

New member
יש הסבורים כי במערכות RT,

עדיף להשתמש בC ולא בCPP, ולא תמיד אתה הראש צוות.
 

annefan

New member
ויש מערכות שפשוט אין CPP

קומפיילר זה יצור מספיק מסובך אפילו ל-C בלבד. להיכנס למורכבות של אובייקטים, ירושות, פונקציות וירטואליות, templates וכל שאר הדברים ש-++C תומכת בהם, יעלה את זמן כתיבת\העברת הקומפיילר למערכת כזו בכמה סדרי גודל. מהצד השני, במערכות כאלה (לרוב מערכות משובצות) רמת המורכבות של הקוד, בד"כ (לא תמיד, בד"כ) היא כזו שאפשר להסתדר די בקלות עם C. כרגיל, הכל עניין של trade-offs. אם צריך לכתוב מערכת ממש מורכבת כזו, זה שיקול לעשות porting לקומפיילר.
 

eyalbd

New member
האמת, הופתעתי

ניסיתי תוכנית פשוטה עם setjmp ו longjmp. הופתעתי מאד למצוא שבורלנד עושה קיפול (stack unwind( מסודר וקורא ל-destructors זו הרחבה טובה לדעתי. GCC לא קורא ל dtor-ים. אפשר לבטל את ההתנהגות הזאת של בורלנד אם מבטלים exceptions בקומפילציה. אגב exceptions - ה"תקורה" היא קצת בגודל הקוד. בזמן ריצה רגילה אין שום הבדלי ביצועים (עם GCC). כאשר יש מקרה חריג לא הייתי קורה לזה overhead כי המגנון המובנה בשפה עושה דברים שמימלא היית צריך לעשות ע"י קיפול משלך. הנה התוכנית:
#include <iostream> #include <setjmp.h> jmp_buf start; struct Test { ~Test() { std::cout << "~Test Called\n"; } }; extern void call_t(Test*); void make_a_jump() { std::cout << "Before longjmp\n"; Test t; call_t(&t); longjmp(start, 1); } void jump_already_called() { std::cout << "After longjmp\n"; } void call_t(Test* t){} int main() { int x = setjmp(start); if (x) jump_already_called(); else make_a_jump(); }​
 

צבתות

New member
שאלה נוספת...dispose

dospose שמקבלת פוינטר מציבה בו nil בסוף? אפשר להעביר ל-dispose איזה destructor, ככה לפחות כתוב ב-help. מישהו יודע אם זה תקף לפסקל 5? אני עובד עם 7, אבל צריך לעמוד בסטנדרט 5 (אל תשאלו למה...). ובכלל איפה אפשר למצוא מידע על דברים מהסוג הזה?
 
למעלה