无法在链接列表中使用“void *”

时间:2014-02-19 04:55:20

标签: c generics casting linked-list void

我有一个通用链表,如下所示:

queue.hpp

typedef struct queue_node
{
    struct queue_node *next;
    struct queue_node *prev;
    void *data;
    int32_t index;
} queue_node;

typedef struct queue 
{
    struct queue_node *head;
    struct queue_node *tail;
    struct queue_node *current;
    int32_t max_entries;
    int32_t num_entries;
} queue;

我认为这很简单,但我很难利用void *数据来处理任意参数(通常是在别处定义的自定义对象)。当我从节点中提取数据时,我尝试将其作为所需对象进行转换。在这种情况下,我试图将proc_instruction转换为回读我存储在那里的数据 - >分段错误:

procsim.cpp:

while (total_instructions < 5000 && fscanf(proc_tf, "%x %d %d %d %d\n", 
                          &p_inst->address,
                          &p_inst->type, 
                          &p_inst->dst, 
                          &p_inst->src[0], 
                          &p_inst->src[1]) != EOF) {
      trace_queue = append_node(trace_queue,p_inst); // stores p_inst in new trace_queue node
      trace_queue->current = goto_queue_first(trace_queue); 
      p_inst = (proc_instruction*)trace_queue->current->data; // trying to get stored inst from trace_queue node
      printf("%x %d %d %d %d\n",p_inst->address,p_inst->type, p_inst->dst, p_inst->src[0], p_inst->src[1]);
    }

这是我追加数据的地方(如果它有帮助):

queue.cpp

queue *append_node(queue *app_q, void *app_data)
{
    if(!queue_is_empty(app_q))
      app_q->current = goto_queue_last(app_q);

    queue_node *n = (queue_node *)emalloc(sizeof(*n));
    n->prev = app_q->current;
    n->next = app_q->tail;
    app_q->current = goto_queue_last(app_q);
    app_q->current->data = app_data;
    app_q->num_entries++;
    app_q->current->index = app_q->num_entries;

    return app_q;
}

我已经看过人们做过这个的示例代码,但我似乎无法得到它。我必须在这里犯一个根本性的错误。谢谢你们。女孩们。

2 个答案:

答案 0 :(得分:0)

似乎在“append_node”中不需要queue_node * current,因为你想将新节点附加到尾部。

我没有看到“app_q”的初始化,我认为memset(0)在分配时会被调用。

queue *append_node(queue *app_q, void *app_data)
{
    queue_node *n = (queue_node *)emalloc(sizeof(*n));

    memset(n, 0, sizeof(queue_node));
    if ( NULL == app_q->head)
    {
        app_q->head = n;
        app_q->tail = n;
    }
    else
    {
        n->prev = app_q->tail;
        n->next = NULL;

        app_q->tail->next = n;
        app_q->tail = n;
    }

    n->data = app_data;
    n->index = app_q->num_entries;

    return app_q;
 }

答案 1 :(得分:0)

好吧,我做了一个愚蠢的事情:我使用的是g ++而不是gcc,当使用带有“void *”的转换时很重要 - c ++需要更多的逻辑才能做到这一点。现在是代码:

procsim.c

 /* Copy the trace file into a linked list */
int total_instructions = 0;
proc_instruction *p_inst = (proc_instruction *)emalloc(sizeof(*p_inst));
queue *trace_queue = init_queue();
proc_instruction *inst;

while (total_instructions < 5000 && fscanf(proc_tf, "%x %d %d %d %d\n", 
                      &p_inst->address,
                      &p_inst->type, 
                      &p_inst->dst, 
                      &p_inst->src[0], 
                      &p_inst->src[1]) != EOF) {
  trace_queue = append_node(trace_queue,p_inst);
  inst = trace_queue->current->data;    // no need to explicitly cast using gcc
  printf("%x %d %d %d %d\n",inst->address,inst->type, inst->dst, inst->src[0], inst->src[1]);
  trace_queue->current = trace_queue->current->next;
  ++total_instructions;   
}

输出打印出我的预期,即proc_tf数据文件中的数据。

我也忘记了通过将当前节点设置为下一个节点来推进列表,因此它会一遍又一遍地打印相同的内容。

感谢。