我有一个通用链表,如下所示:
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;
}
我已经看过人们做过这个的示例代码,但我似乎无法得到它。我必须在这里犯一个根本性的错误。谢谢你们。女孩们。
答案 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数据文件中的数据。
我也忘记了通过将当前节点设置为下一个节点来推进列表,因此它会一遍又一遍地打印相同的内容。
感谢。