בעיית קומפילציה ב- C שגיאה: ERROR C2071 - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


Shlompy

Recommended Posts

הבעיה היא שהגדרת 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.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...