2014-02-19 27 views
0

我有一個通用的鏈表,看起來像這樣:麻煩鏈表使用「無效*」

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

「append_node」的目的是將新節點追加到列表尾部? –

+0

是 - 然後返回帶有新節點的隊列。 – culight

+0

n-> prev = app_q-> tail; app_q-> tail-> next = n; app_q-> tail = n; n> next = NULL;我認爲這是你想要的。 –

回答

0

好吧,我做了愚蠢的事情:我用G ++而不是使用GCC與「無效*」鑄造時事項 - C++需要更多的邏輯來做到這一點比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數據文件中的數據。

我也忘了提前通過設置當前節點到下一個節點,所以它一直重複打印相同的東西。

謝謝。

0

似乎queue_node *因爲您想要將新節點追加到尾部,所以在「append_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; 
} 
+0

是的,使用當前是不必要的,我忘了使用memset(0)。謝謝傑裏。 – culight