从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

我正在为一门操作系统课做作业。我们有一些代码可以用来帮助我们完成任务,但我对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 = 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*
    ),或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;
    }
    
    当您调用
    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很陌生