从C中的另一个类的方法中检索数据

时间:2012-05-28 22:12:40

标签: 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 = 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);

但编译时我收到错误invalid type argument a->a

1 个答案:

答案 0 :(得分:1)

当你致电List_head_info()时,你会得到两件事:

  1. 头部数据的指针(void *),或NULL。
  2. 指示指针是否为非NULL的状态。
  3. 如果成功返回,您可以将void *转换(强制或强制转换)为pcb_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_data的初始化是多余的; List_head_info()中的代码始终将值设置为至少一次(为NULL或0),有时为两次(第二次设置为列表中头项的数据组件)。

    这是'示例代码',其中包含足够的信息进行编译。我已经'反向设计'列表结构足够有意义;当然,实际的实施会有所不同。它在相当严格的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;
    }