从C中另一个类的方法检索数据
我正在为一门操作系统课做作业。我们有一些代码可以用来帮助我们完成任务,但我对C语言的编程经验很少,我不知道如何使用它。我要做的是把信息打印在列表的最前面。该列表是定义为的结构列表从C中另一个类的方法检索数据,c,list,printf,C,List,Printf,我正在为一门操作系统课做作业。我们有一些代码可以用来帮助我们完成任务,但我对C语言的编程经验很少,我不知道如何使用它。我要做的是把信息打印在列表的最前面。该列表是定义为的结构列表 typedef struct { char name[NAME_MAX]; int lifetime; } pcb_t; int List_head_info ( List_t *list, void **data ) { int all_ok = 0; *data = N
typedef struct
{
char name[NAME_MAX];
int lifetime;
} pcb_t;
int
List_head_info ( List_t *list, void **data )
{
int all_ok = 0;
*data = NULL;
if ((list != NULL) && (list->head != NULL)) {
*data = list->head->data;
all_ok = 1;
}
return all_ok;
}
我试图用以下方式展示它们:
printf("test: %s", List_head_info(&processes, (void *)pcb)->name);
但是在编译时,我收到了错误
无效的类型参数a->a
。当您调用List\u head\u info()
时,您将返回两件事:
void*
),或NULLvoid*
转换(强制或强制转换)为pcb\u t*
,然后使用它打印数据
我具体怎么做 可能有点像这样:
List_t list;
...code to initialize and maybe add things to the list...
void *head_data = 0;
if (List_head_info(&list, &head_data))
{
pcb_t *item = (pcb_t *)head_data;
printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}
严格来说,head\u数据的初始化是多余的;List\u head\u info()
中的代码始终至少设置一次值(设置为NULL或0),有时设置两次(第二次设置为列表中head项的数据组件)
这是“示例代码”,其中有足够的信息可供编译。我已经对列表结构进行了“逆向工程”,使之有意义;当然,实际执行情况将有所不同。这在相当严格的GCC警告级别下进行了干净的编译,在Mac OS X 10.7.4上使用GCC 4.1.2和4.7.0。在AFAICS中,它避免了一些与“严格别名”相关的复杂问题,而在现阶段您确实不想担心这些问题
#include <stdio.h>
enum { NAME_MAX = 40 };
typedef struct Node Node;
struct Node
{
void *data;
Node *next;
};
typedef struct
{
Node *head;
Node *tail;
} List_t;
typedef struct
{
char name[NAME_MAX];
int lifetime;
} pcb_t;
extern int List_head_info(List_t *list, void **data);
extern void another_func(List_t processes);
void another_func(List_t list)
{
void *head_data = 0;
if (List_head_info(&list, &head_data))
{
pcb_t *item = (pcb_t *)head_data;
printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}
}
int
List_head_info ( List_t *list, void **data )
{
int all_ok = 0;
*data = NULL;
if ((list != NULL) && (list->head != NULL)) {
*data = list->head->data;
all_ok = 1;
}
return all_ok;
}
#包括
枚举{NAME_MAX=40};
typedef结构节点;
结构体类型
{
作废*数据;
节点*下一步;
};
类型定义结构
{
节点*头;
节点*尾部;
}名单;;
类型定义结构
{
字符名[name_MAX];
int寿命;
}印刷电路板;
外部内部列表\头部信息(列表*列表,无效**数据);
外部无效另一个函数(列表进程);
作废另一个函数(列表)
{
void*head_data=0;
if(列表\标题\信息(&列表和标题\数据))
{
pcb_t*项目=(pcb_t*)头部数据;
printf(“生存期:%.2d;名称:%s\n”,项目->生存期,项目->名称);
}
}
int
列表标题信息(列表*列表,无效**数据)
{
int all_ok=0;
*数据=空;
如果((列表!=NULL)&&(列表->头!=NULL)){
*数据=列表->标题->数据;
全部正常=1;
}
返回所有_ok;
}
当您调用List\u head\u info()
时,您将返回两件事:
指向头部数据的指针(void*
),或NULL
指示指针是否为非空的状态
如果它成功返回,您可以将void*
转换(强制或强制转换)为pcb\u t*
,然后使用它打印数据
我具体怎么做
可能有点像这样:
List_t list;
...code to initialize and maybe add things to the list...
void *head_data = 0;
if (List_head_info(&list, &head_data))
{
pcb_t *item = (pcb_t *)head_data;
printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}
严格来说,head\u数据的初始化是多余的;List\u head\u info()
中的代码始终至少设置一次值(设置为NULL或0),有时设置两次(第二次设置为列表中head项的数据组件)
这是“示例代码”,其中有足够的信息可供编译。我已经对列表结构进行了“逆向工程”,使之有意义;当然,实际执行情况将有所不同。这在相当严格的GCC警告级别下进行了干净的编译,在Mac OS X 10.7.4上使用GCC 4.1.2和4.7.0。在AFAICS中,它避免了一些与“严格别名”相关的复杂问题,而在现阶段您确实不想担心这些问题
#include <stdio.h>
enum { NAME_MAX = 40 };
typedef struct Node Node;
struct Node
{
void *data;
Node *next;
};
typedef struct
{
Node *head;
Node *tail;
} List_t;
typedef struct
{
char name[NAME_MAX];
int lifetime;
} pcb_t;
extern int List_head_info(List_t *list, void **data);
extern void another_func(List_t processes);
void another_func(List_t list)
{
void *head_data = 0;
if (List_head_info(&list, &head_data))
{
pcb_t *item = (pcb_t *)head_data;
printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}
}
int
List_head_info ( List_t *list, void **data )
{
int all_ok = 0;
*data = NULL;
if ((list != NULL) && (list->head != NULL)) {
*data = list->head->data;
all_ok = 1;
}
return all_ok;
}
#包括
枚举{NAME_MAX=40};
typedef结构节点;
结构体类型
{
作废*数据;
节点*下一步;
};
类型定义结构
{
节点*头;
节点*尾部;
}名单;;
类型定义结构
{
字符名[name_MAX];
int寿命;
}印刷电路板;
外部内部列表\头部信息(列表*列表,无效**数据);
外部无效另一个函数(列表进程);
作废另一个函数(列表)
{
void*head_data=0;
if(列表\标题\信息(&列表和标题\数据))
{
pcb_t*项目=(pcb_t*)头部数据;
printf(“生存期:%.2d;名称:%s\n”,项目->生存期,项目->名称);
}
}
int
列表标题信息(列表*列表,无效**数据)
{
int all_ok=0;
*数据=空;
如果((列表!=NULL)&&(列表->头!=NULL)){
*数据=列表->标题->数据;
全部正常=1;
}
返回所有_ok;
}
< /C> >方法和类是比C++更适合C++的术语——你具体想做什么?你试过什么?你得到了什么输出?你期望得到什么结果?@sarnold显示了我对c的了解!我真正想做的是存储一个系统进程列表,然后在调用中断(siguser1)时将它们吐出。但我甚至不知道如何显示列表中的任何元素。我已经创建了一个数据类型,并且能够将它们添加到列表中。但随后试图通过键入printf(“test:%s”,List_head_info(&processs,(void*)pcb)->name)来显示它们;但是,当编译方法和类是更适合C++的术语时,我给出了错误无效类型参数a->a——你具体想做什么?你试过什么?你得到了什么输出?你期望得到什么结果?@sarnold显示了我对c的了解!我真正想做的是存储一个系统进程列表,然后在调用中断(siguser1)时将它们吐出。但我甚至不知道如何显示列表中的任何元素。我已经创建了一个数据类型,并且能够将它们添加到列表中。但随后试图通过键入printf(“test:%s”,List_head_info(&processs,(void*)pcb)->name)来显示它们;但是我在编译时遇到了一个错误,无效类型参数a->a。我觉得问这个问题很愚蠢,但我具体怎么做呢?我对c非常陌生,不幸的是,我觉得问这个问题很愚蠢,但我具体怎么做呢?不幸的是,我对c很陌生