2016-05-30 71 views
2

我是C編程的新手。我必須爲家庭作業編寫一些功能/程序,然後用教授給出的make test來測試它們。c警告 - 從不兼容的指針類型傳入'insert'的參數1

我有一個兩個元素的結構:第一個元素是一個指向列表的指針,第二個元素是列表排序的順序類型。這裏是數據結構:

/* order type 
NOTORD = no order 
TIME = ordered by increasing time 
POSITION = ordered by increasing position */ 
typedef enum {NOTORD=0, TIME=1, POSITION=2} ord_t; 

typedef struct elem { 
    double position; 
    double time; 
    struct elem * next; 
} elem_t; 

typedef struct { 
    elem_t * head; 
    ord_t ord; 
} lista_t; 

我必須根據順序的類型插入一個元素(由輸入給出)到列表中。這裏是我的代碼:

void inserisciInTesta(lista_t *l, elem_t *el) { 
    el->next=l->head; 
    l->head=el; 
} 

void inserisciTime(lista_t * l, elem_t* pelem) { 
    if(l->head->time >= pelem->time) 
     inserisciInTesta(l, pelem); 
    else 
     inserisciTime(l->head->next, pelem); 
} 

void inserisciPosition(lista_t * l, elem_t* pelem) { 
    if((l->head)->position >= pelem->position) 
     inserisciInTesta(l, pelem); 
    else 
     inserisciPosition(l->head->next, pelem); 
} 

int inserisci(lista_t * l , elem_t* pelem) { 
    if(l->ord==TIME) { 
     inserisciTime(l, pelem); 
     return 0; 
} 
    else if(l->ord==POSITION){ 
     inserisciPosition(l, pelem); 
     return 0; 
} 
    else { 
     inserisciInTesta(l, pelem); 
     return 0; 
    } 
} 

使得測試,我得到這些警告:

raggi.c:在函數 'inserisciTime':

raggi.c:42:27:警告:使從兼容的指針類型 'inserisciTime' 的參數1 [-Wincompatible指針類型]

 inserisciTime(l->head->next, pelem); 
        ^

raggi.c:38:6:注:預期「lista_噸* {又名結構*}」,但參數的類型的 '結構ELEM *'

空隙inserisciTime(lista_t * L,elem_t * pelem){ ^

raggi.c:在函數 'inserisciPosition':

raggi.c:49:31:警告:傳遞來自兼容的指針類型 'inserisciPosition' 的參數1 [-Wincompatible指針類型]

 inserisciPosition(l->head->next, pelem); 
         ^

raggi.c:45:6:注:期望'lista_t * {aka struct *}',但參數的類型是'str UCT ELEM *」

無效inserisciPosition(lista_t * L,elem_t * pelem){ ^

什麼是錯我的代碼?預先感謝您的幫助。

+0

是不是警告安靜清除:「*'參數1 ...不兼容的指針類型」*「? – alk

+0

也有十幾個題目幾乎相同的問題,這是非常警告的。這是重複的。 – alk

回答

0

錯誤的原因是Tom解釋的。我建議你改變函數,而不是使用遞歸調用(即函數調用自己),你使用while循環來找到你需要插入元素的地方。

考慮到在插入新元素時需要修改兩個指針:指向下一個元素的指針和來自前一個元素的指針。用遞歸函數做這件事可能會更令人困惑。

此外,請檢查插入列表開頭,列表末尾以及列表是否爲空的特殊情況。

3

編譯器警告幾乎全都說了。考慮第一個。 insetisciTime預計lista_t *作爲其第一個參數。壞通話通過l->head->next。那是什麼類型?那麼,llista_t *。所以l->head是一個elem_t *。所以l->head->nextstruct elem *,相當於elem_t *。這是一種類型不匹配:函數需要一個lista_t *,並且您傳遞一個elem_t *

其中一個必須改變:要麼改變函數來匹配你傳遞的內容,要麼改變你傳遞的內容以匹配函數期望的內容。編譯器警告正在將你保存在這裏,因爲它不可能按原樣工作。

其他警告具有完全相同的問題。

相關問題