2016-07-29 98 views
0

我正在爲我的編程主題做一個練習,這是一個醫院Manegment計劃。在程序開始時,我需要將信息從.txt發送到動態結構。我一直在爲最後幾個小時作戰,爲什麼我會丟失數據。功能丟失指針信息

爲什麼退出此功能後我的頭指針爲空,我試圖將其打印出來?指針不應該保存這些信息。

在此先感謝。 Ps:如果您有任何有關我的算法的提示,請隨時說。

void dump_med(struct medico *head_m) 
{ 
    int i = 1; 
    struct medico *new_med; 
    struct medico *temp_m; 

    FILE *f = fopen(M_FILE, "r"); 
    new_med = malloc(sizeof(struct medico)); 
    temp_m = malloc(sizeof(struct medico)); 

    if(f == NULL) 
    { 
     printf("Erro a abrir o ficheiro\n"); 
     return; 
    } 

    if(new_med == NULL || temp_m == NULL) 
    { 
     printf("Erro a alocar a memória\n"); 
     return; 
    } 
    while(!feof(f)) 
    { 
     new_med = realloc(new_med, sizeof(struct medico) * i); 
     if(new_med == NULL) 
     { 
      printf("Erro a realocar a memória\n"); 
      return; 
     } 
     fscanf(f, "%[^\n]", new_med->nome); 
     fscanf(f, "%s %d.%d--%d.%d\n", new_med->especialidade, &(new_med->entrada.h), 
      &(new_med->entrada.m), &(new_med->saida.h), &(new_med->saida.m)); 
     temp_m = new_med; 
     temp_m->next = head_m; 
     head_m = temp_m; 
     new_med = new_med->next; 
     i++; 

    } 
    free(new_med); 
    free(temp_m); 
    fclose(f); 
} 
+0

我問你如何在這裏試圖建立一個前向鏈接鏈表的機制。有很多非常簡單的方法可以做到這一點。 – WhozCraig

+0

如果你引導我更簡單的方式,那就是我的第五次鏈接列表嘗試,其他時候我總是失去了頭部位置,我會很感激。 – m3k3r1

+0

[類似的東西](http://pastebin.com/XESzqnap),使用提供的文件名和節點指針的地址調用,該指針將接收正在生成的列表。祝你好運。在[codereview.stackexchange.com](http://codereview.stackexchange.com)上可能會加上任何未來的「這怎麼可能更好」的問題。 – WhozCraig

回答

1

在C中,所有參數都是按值傳遞的。所以當修改head_m時,你只是修改一個局部變量。

如果您希望將更改反映到調用函數中,請傳遞所討論變量的地址,然後在函數中取消引用指針變量。

void dump_med(struct medico **head_m) 
{ 
    ... 
    temp_m->next = *head_m; 
    *head_m = temp_m; 
    ... 
} 

然後調用它像這樣:

dump_med(&head_m); 
1

C使用傳遞由函數參數傳遞值。如果您要修改函數中的head_m,則不會將其反映到實際參數中。您需要

  • 傳遞一個指針,指向要修改的指針
  • 有一個return聲明,返回新的

這就是說,

  1. 請參閱Why is 「while (!feof (file))」 always wrong?
  2. 經常檢查scanf()和家人的返回值。
+0

感謝您的提示,我會嘗試停止使用feof,並且在我幾乎完成程序的基本框架時,我會更深入地檢查scanf()的返回值 – m3k3r1