29-06-2008, 22:42
|
|
|
חבר מתאריך: 26.05.08
הודעות: 120
|
|
אני מבין את ההיגיון במה שאתה אומר, אבל אי-אפשר להחיל אותו לגבי המקרה הכללי
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);
}
וכאן כבר אי-אפשר לטעות.
|