C编程:访问枚举值

C编程:访问枚举值,c,struct,enums,C,Struct,Enums,对于学校来说,我必须写一份议程,它必须保存关于考试、任务和讲座的数据 访问结构中的枚举时遇到问题 我的结构如下所示: struct Item{ enum {TASK, EXAM, LECTURE} entryType; char* name; char* course; time_t start; time_t end; union { struct Task* task; struct Exam* exam; struct Lecture* lecture; }

对于学校来说,我必须写一份议程,它必须保存关于考试、任务和讲座的数据

访问结构中的枚举时遇到问题

我的结构如下所示:

struct Item{

enum {TASK, EXAM, LECTURE} entryType;

char* name;
char* course;

time_t start;
time_t end;

union
{
    struct Task* task;
    struct Exam* exam;
    struct Lecture* lecture;
} typeData;
};
现在,我必须使用我的枚举设置项的类型。 此结构在Item.h中定义。 在包含项目h的项目c中,我使用以下代码:

struct Item* createItem(char* type){
struct Item* newItem;

newItem = (struct Item *) malloc (sizeof(struct Item));

if (strcmp(type, "Task") == 0)
{
    //newItem->entryType = newItem->TASK;
    newItem->typeData.task = createTask();
} else if (strcmp(type, "Exam") == 0)
{
    //newItem->entryType = newItem->EXAM;
    newItem->typeData.exam = createExam();
} else if (strcmp(type, "Lecture") == 0)
{
    //newItem->entryType = newItem->LECTURE;
    newItem->typeData.lecture = createLecture();
}

return newItem;
}
注释代码给出了错误(例如,对于任务):


错误C2039:“任务”:不是“项”的成员。

我的第一点是不必要的,第二点将createItem的参数更改为int,第三点在数据类型中使用指针,因此我们确实应该看到这些函数,第四点在结构中创建一个名为type的int字段

   struct Item* createItem(int type){
   struct Item* newItem;

   newItem = malloc (sizeof(struct Item));    

  newItem->entryType = type;

   if (type == 0)
   {
     newItem->typeData.task = createTask();
   } else if (type == 1) 
   {
     newItem->typeData.exam = createExam();
   } else if (type == 2)
   {
     newItem->typeData.lecture = createLecture();
   }

 return newItem;
 }

我的第一点是不必要的,第二点是将createItem的参数更改为int,第三点是在数据类型中使用指针,因此我们确实应该看到这些函数,第四点是在结构中创建一个名为type的int字段

   struct Item* createItem(int type){
   struct Item* newItem;

   newItem = malloc (sizeof(struct Item));    

  newItem->entryType = type;

   if (type == 0)
   {
     newItem->typeData.task = createTask();
   } else if (type == 1) 
   {
     newItem->typeData.exam = createExam();
   } else if (type == 2)
   {
     newItem->typeData.lecture = createLecture();
   }

 return newItem;
 }


当您声明一个
enum
时,它的内容实质上变成了编译时常量,就像您定义了它们一样。特别是,如果你有一个
enum{A,B,C}foo
,你可以通过
A
来访问选项,而不是像你想象的那样
foo->A

当你声明一个
enum
时,它的内容基本上变成了编译时常量,就好像你已经定义了它们一样。特别是,如果你有一个
enum{A,B,C}foo
,你可以通过
A
,而不是像你想象的那样
foo->A
,来访问选项。

TASK
不是
TASK
。你做这些字符串比较是为了什么?如果您使用的是枚举,则没有理由使用strcmp。枚举成员的工作方式与整数类似。此外,.字符串比较是因为我从用户输入中获取类型,所以我使用字符串来确定必须创建哪个项。代码的比较部分在我想工作时起作用,我不能访问NeWITION->任务来设置新创建的项目的类型。他可能认为他在教C++。他不是C和C++是两种不同的语言。C++中从不使用C样式,而C++中从不使用C样式的转换。<代码>任务<代码>不是<代码>任务<代码>。如果您使用的是枚举,则没有理由使用strcmp。枚举成员的工作方式与整数类似。此外,.字符串比较是因为我从用户输入中获取类型,所以我使用字符串来确定必须创建哪个项。代码的比较部分在我想工作时起作用,我不能访问NeWITION->任务来设置新创建的项目的类型。他可能认为他在教C++。他不是C和C++是两种不同的语言。你从不在C中抛出,而且你在C++中从不使用C样式的转换。谢谢使用这个类型的int的提示,我会注意的。typeData函数没有给我任何错误,它们工作正常,所以我看不出有什么理由为它们提供代码。但问题是在我们的作业中,我们已经得到了项目结构,我精确地复制了它。如果不将枚举设为全局,是否就无法执行此操作?@crognar您可以使用int访问枚举的值。所以任何int和entryType都是可互换的。@crognar我现在的代码不需要全局枚举。非常感谢,这解决了我的问题。我猜您不能通过使用名称来访问结构内部定义的不同值?@crognar为了简单起见,您不能只指向枚举值。如果枚举是全局的,您的main将知道枚举值并发送一个。因为它不存在,而且作为程序员,您知道枚举中有什么,所以您可以将int传递给结构(假设您进行了正确的错误检查)。typeData函数没有给我任何错误,它们工作正常,所以我看不出有什么理由为它们提供代码。但问题是在我们的作业中,我们已经得到了项目结构,我精确地复制了它。如果不将枚举设为全局,是否就无法执行此操作?@crognar您可以使用int访问枚举的值。所以任何int和entryType都是可互换的。@crognar我现在的代码不需要全局枚举。非常感谢,这解决了我的问题。我猜您不能通过使用名称来访问结构内部定义的不同值?@crognar为了简单起见,您不能只指向枚举值。如果枚举是全局的,您的main将知道枚举值并发送一个。因为它不存在,而且作为程序员,您知道枚举中的内容,所以您可以将一个int(假设您进行了正确的错误检查)传递给结构。那么如何访问枚举Name1{Value2=0x1;}?就像我正在使用的代码一样,需要能够从0x1而不是Value2中选择值名称;就像在类中一样,如何访问枚举名称1{Value2=0x1;}?就像我正在使用的代码一样,需要能够从0x1而不是Value2中选择值名称;就像你在课堂上一样