2016-05-30 45 views
2

私はCプログラミングの初心者です。私は宿題のためのいくつかの機能/手順を書かなければならず、教授によって与えられたmakeテストでそれらをテストしなければならない。c警告 - 互換性のないポインタ型から 'insert'の引数1を受け取ります

私は、2つの要素を持つ構造体を持っています。最初の要素はリストへのポインタで、2番目の要素はリストのソート順の種類です。データ構造体は次のとおりです。

/* 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_ T * {別名構造体*}構造体ELEMの*」が、引数がタイプである ''

空隙inserisciTime(lista_t * 1、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ループを使用して要素を挿入する必要がある場所を見つけてください。

新しい要素を挿入するときに2つのポインタ、次の要素へのポインタ、および前の要素からのポインタを変更する必要があることを考慮してください。再帰関数でこれを行うと、もっと混乱するかもしれません。

また、リストの先頭、リストの最後、およびリストが空の場合に挿入する特別なケースを確認します。

3

コンパイラの警告はほとんどすべてを言います。最初のものを考えてみましょう。 insetisciTimeは、最初の引数としてlista_t *が必要です。悪い呼び出しはl->head->nextを渡しています。それはどんなタイプですか?まあ、llista_t *です。したがってl->headelem_t *です。したがって、l->head->nextstruct elem *で、elem_t *に相当します。これはタイプの不一致です:関数はlista_t *を予期し、elem_t *を渡しています。

2つのうちの1つを変更する必要があります。渡すものと一致するように関数を変更するか、関数が期待するものと一致するように渡すものを変更します。コンパイラの警告は、あなたがここで保存しています。なぜなら、おそらくそれが動作する可能性がないからです。

他の警告はまったく同じ問題を抱えています。

関連する問題