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

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



  #12  
ישן 29-06-2008, 22:42
  מאבטח מאבטח אינו מחובר  
 
חבר מתאריך: 26.05.08
הודעות: 120
אני מבין את ההיגיון במה שאתה אומר, אבל אי-אפשר להחיל אותו לגבי המקרה הכללי
בתגובה להודעה מספר 11 שנכתבה על ידי שימי שמתחילה ב "כן, אבל לדעתי זה הרגל טוב..."

sizeof לא יפעל לגבי פרמטרים שקיבלת, כי בניגוד למערכים סטטיים שיצרת במקום, הפרמטרים הם פויינטרים, ו-sizeof עליהם יחזיר גודל של פוינטר, וזה לא עוזר לנו. זה מה שלא מאפשר לכתוב משהו כזה:
קוד:
#define COOL_FGETS(buf) fgets(buf, sizeof(buf), stdin)

במקרה הכללי יש שני דברים שאפשר לעשות - מה שעשיתי למעלה, שהוא ליצור קבוע, ובעזרתו לייצר את המשתנה, ואותו לספק כגודל של המשתנה (אבל מה יקרה אם אני אטעה?), או הפיתרון הטוב יותר, שמאפשרת לי CPP (וגם C בצורות מסוימות), להשתמש במחלקה שמכמסת את המחרוזת ואת הגודל שלה. גם ב-C אפשר לעשות משהו כזה:
קוד:
typedef _coolstr { char *str; unsigned long int size; } coolstr; coolstr *allocstring(unsigned long int size); void freestring(coolstr *str); bool coolfgets(coolstr *str, FILE *stream) { return (fgets(str->str, str->size, stream) != NULL); }

וכאן כבר אי-אפשר לטעות.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #21  
ישן 04-07-2008, 11:23
  מאבטח מאבטח אינו מחובר  
 
חבר מתאריך: 26.05.08
הודעות: 120
אחי, אם לא הייתי צעיר מת הייתי יודע שאפשר להגדיר בנוהל ל-new להחזיר NULL במקום לזרוק
בתגובה להודעה מספר 20 שנכתבה על ידי DrTempi שמתחילה ב "לא זה לא יותר נוח"

חפש בגוגל new nothrow וכנראה תלמד משהו חדש.

מצד שני, new ו-delete קוראים ל-constructor-ים ול-destructor-ים, ו-xalloc ו-free לא.

מה עדיף?
קוד:
C *p = new(std::nothrow) C; if (p == NULL) { whatever; } ... delete p;

או הקוד הנפלא שאתה מציע לנו:
קוד:
C *p = static_cast<C*>(malloc(sizeof(C))); if (p == NULL) { whatever; } p->C::C(); ... p->~C(); free(p);


וזה אפילו לא קוד תקני, אלא טריק שעובד ב-VCPP7. כדי לקרוא ל-constructor על זיכרון שהוקצה ידנית, תצטרך להשתמש ב-placement new:
קוד:
C *p = static_cast<C*>(malloc(sizeof(C))); if (p == NULL) { whatever; } C *p2 = new(p) C(); ... p->~C(); free(p);


אם אתה רוצה לקרוא ל-constructor, אתה חייב להשתמש ב-new. מצד שני, new לא חייב לזרוק exception אם ההקצאה נכשלה. אתה יכול לבחור איזו התנהגות שלו אתה מעדיף. ברכות.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #25  
ישן 29-06-2008, 20:40
  מאבטח מאבטח אינו מחובר  
 
חבר מתאריך: 26.05.08
הודעות: 120
גוגל הוא מקור שמרחיב דעתו של כל אדם.
בתגובה להודעה מספר 24 שנכתבה על ידי rlsf שמתחילה ב "באגים בהגדרת קבועים כ define?..."

הבעיה ה"קלה" היא שהקומפיילר לא מודע לקיומם של מאקרואים, ולכן הם לא נכנסים ל-symbol table, וזה יהיה ממש כיף לדבג קוד שמלא ב-magic numbers שאין לך מושג מה המשמעות שלהם, גם אם מדובר בבילד debug.

אבל הבעיה האמיתית חמורה יותר - define הוא לא חלק מהשפה מבחינת הקומפיילר: ל-define-ים אין טיפוס, הם לא מצייתים לחוקי scoping, ועוד ועוד.

בגוגל ניתן למצוא באגים משעשים כמו זה:
קוד:
const int NUMBER = -42; int main() { int x = -NUMBER; }

בנוסף לבאגים קלאסיים כמו זה:
קוד:
#define NUMBER 5+2; int x = 3 * NUMBER;


וסתם קטעים מעצבנים כמו:
קוד:
#define MACRO 1.653 const double CONST = 1.653; double Square(double const *p) { return (*p) * (*p); } int main() { double a = Square(&MACRO); // won't compile double b = Square(&CONST); // compiles OK return 0; }

ואת אלה הוצאתי מאשכול אחד בלבד מחמישה שפתחתי מגוגל.

define זה נורא - אל תשתמש בזה.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

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

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

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

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



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

הדף נוצר ב 0.10 שניות עם 11 שאילתות

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

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