עבור לתוכן

בעיית קומפילציה ב- C שגיאה: ERROR C2071

Featured Replies

פורסם

הבעיה היא שהגדרת struct ללא שם, וטיפוס Carlot שהוא בעצם אותו struct ללא שם.


/* C-style */
typedef struct Carlot_t
{

} Carlot;

Carlot_t c1; /* <-- not OK */
struct Carlot_t c1; /* <-- OK */
Carlot c1; /* <-- also OK because of: typedef struct Carlot_t Carlot; */

// C++ style
struct Carlot
{
static int x;
};

Carlot::int x;

פורסם
  • מחבר

איפה הוספת את ההגדרה int Carlot::size?

בתוך ה MAIN

הסיומת של הקובץ היא CPP.

הבעיה היא שהגדרת struct ללא שם' date=' וטיפוס Carlot שהוא בעצם אותו struct ללא שם.[/quote']

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


typedef struct
{
Type vehicle;
static int size; //static isn't working
unsigned int taken:1;
int type;
}Carlot;

למה אתה משתמש ב- typedef?

מה הסיומת של הקובץ שלך? אתה מנסה לקמפל את זה לC או CPP?

מה זה :1?

וחסר לך " בשורה הראשונה של הקובץ של הMAIN.

typedef נועד לתת שם פשוט למבנה במקום שייקרא struct Carlot

unsigned int taken:1 זה משתנה שניתן להשתמש רק בביט אחד, שזה בעצם משתנה בוליאני

לגבי הגרשיים שחסר, זאת לא הייתה הבעיה, רק טעות בסימון לפני שהעתקתי את זה לכאן/

אני אפשט את המבנה אפילו עוד יותר, רק בשביל להבהיר שהבעיה היא לא בשאר הקוד, גם המבנה הזה עם הצהרה עליו במיין לא עוברת קומפילציה:


struct abc
{
int a;
static int bbb;
};

void main()
{
struct abc shlomi;
int struct abc::bbb; // int abc:bbb also not working
}

מצורפת תמונה של הקוד האחרון עם השגיאות

[attachment deleted by admin]

פורסם

לא מצהירים על Carlot::size בתוך פונקציית ה-main. רק בקובץ cpp כלשהו, כמו משתנה גלובלי.

ב-++C לא צריך להגדיר typedef struct. מספיק להגדיר איך ש-Zelig הראה.

ולגבי משתנה בוליאני, למה לא להגדיר אותו פשוט bool?

פורסם

אתה לא הבנת אותי.

אתה צריך להחליט אם אתה עובד ב-C או ב-C++.

אם אתה עובד ב-C, אז אתה צריך את הטריק המקובל של typedef struct על מנת שתוכל להשתמש בטיפוס ללא struct לפני השם.

אם אתה עובד ב-C++ אז אין צורך ב-typedef, אתה יכול להשתמש ישירות בשם המבנה.

אם אתה עובד ב-C, תשכח מ-static בתוך struct.

אם אתה עובד ב-C++, ואם אתה רוצה static member, אתה חייב לתת ל-struct שם (זה לא אותו דבר כמו להגדיר טיפוס שהוא שם נוסף ל-struct חסר שם, שזה מה שכרגע אתה עושה).

עריכה: הנה תיקון הקוד האחרון שלך:


struct abc
{
int a;
static int bbb;
};
int abc::bbb;

void main()
{
abc shlomi;

shlomi.a = 3;
abc::bbb = 4;
}

פורסם
  • מחבר

או מצויין עכשיו זה עובד.

הסיבה שזה לא עבד זה בגלל שהצהרתי על CARLOT::SIZE בתוך ה MAIN.

כל שאר הדברים העקומים שעשיתי, זה בגלל שאני לא למדתי עדיין C++.

בשפת C אין משתנה מטיפוס bool, אז הייתי חייב ליצור אותו, וכנ"ל לגבי ה TYPEDEF שהייתי חייב בשביל לתת שם נורמלי לטיפוס.

הסיבה היחידה שעבדתי עם קובץ CPP זה כדי לנסות לגרום למשתנה הסטטי לעבוד.

תודה לכולם מאוד על ההסברים המפורטים ותודה שעזרתם לי לעבור את המחסום הזה.

וסליחה Zelig, פספתי את ההודעה שלך ממקודם משום מה.

פורסם

בשפת C אין משתנה מטיפוס bool, אז הייתי חייב ליצור אותו

bool הוא בסך הכל int. הוא לא באמת תופס רק ביט אחד. באותה מידה היית יכול לעשות

typedef int bool;

וכמו שזליג אמר, אתה חייב להחליט אם אתה עובד ב-C או ב-++C. אם לא למדת ++C, ואתה עובד ב-C, אל תנסה לדחוף כל מיני הגדרות של ++C לקוד שלך, אלא פשוט תימנע מלהגדיר משתנים סטטיים כאלה (במקרה הזה היית פשוט צריך להוציא את המשתנה הזה מתוך ה-struct ולהגדיר אותו בתור משתנה גלובלי).

פורסם
  • מחבר

סבבה.

בכל מקרה, יש יתרון בלהגדיר משתנה unsigned int x:1;

אם מבצעים עליו פעולות כמו x++ או x--, הערך שלו תמיד יהיה 0 או 1, בניגוד למשתנה רגיל, ללא שום קשר לגודל שהוא תופס בזכרון.

תודה בכל מקרה!

פורסם

זה לא נכון לוגית לעשות ++ ו- --. אני הייתי מעדיף שיהיה לי באג (שבסופו של דבר אגלה אותו) בעקבות ++ ו- -- מאשר להשתמש בפעולות האלה על משתנה בוליאני.

פורסם
  • מחבר

המממ....

למה, כי זו פעולה יותר ארוכה לביצוע מאשר השמה?

פורסם

כי אין שום הגיון בלעשות ++ או -- למשתנה בוליאני, ואתה לא אמור לסמוך על הערך המספרי שלו (כלומר, אל תניח שבהכרח true == 1).

בגלל זה בשפות אחרות (C#/Java) אי אפשר לעשות את הפעולות האלה.

פורסם

באופן כללי זה מפתיע ולכן זה מקשה על תחזוקת הקוד.

תחשוב על מישהו שהוא לא אתה (או אפילו אתה, בעוד שנה) שקורא את הקוד הזה ומנסה להבין אותו. הוא רואה משהו כמו b++ וישר מניח ש-b הוא איזהו משתנה מספרי, או אולי אינדקס.

אם אתה מתעקש, נדמה לי שזה יכול לעבוד:

x = !x;

זה יעבוד נכון ללא קשר כמה ביטים יש ב-X.

פורסם
  • מחבר

אוקיי תודה לכם.

הפנמתי

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים