c warning - 从不兼容的指针类型传递'insert'的参数1

时间:2016-05-30 09:07:34

标签: c pointers struct insert compiler-warnings

我是C编程的新手。我必须为家庭作业写一些函数/程序,然后用教授给出的make测试来测试它们。

我有一个带有两个元素的结构:第一个元素是指向列表的指针,第二个元素是按顺序排序的顺序类型。以下是数据结构:

/* 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-pointer-types]

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

raggi.c:38:6:注意:预期'lista_t * {aka struct *}'但参数类型为'struct elem *'

     

void inserisciTime(lista_t * l,elem_t * pelem){        ^

     

raggi.c:在函数'inserisciPosition'中:

     

raggi.c:49:31:警告:从不兼容的指针类型传递'inserisciPosition'的参数1 [-Wincompatible-pointer-types]

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

raggi.c:45:6:注意:预期'lista_t * {aka struct *}'但参数类型为'struct elem *'

     

void inserisciPosition(lista_t * l,elem_t * pelem){        ^

我的代码出了什么问题?在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

编译器警告几乎说明了一切。考虑第一个。 insetisciTime期望lista_t *作为其第一个参数。糟糕的电话是l->head->next。那是什么类型的?好吧,llista_t *。因此l->headelem_t *。因此l->head->nextstruct elem *,相当于elem_t *。这是一种类型不匹配:该函数需要lista_t *,并且您正在传递elem_t *

其中一个必须改变:更改功能以匹配您传递的内容,或更改您传递的内容以匹配功能所需的内容。编译器警告将您保存在此处,因为它无法按原样运行。

另一个警告有完全相同的问题。

答案 1 :(得分:0)

错误的原因是汤姆解释的。我建议您更改函数而不是使用递归调用(即函数调用自身),使用while循环查找需要插入元素的位置。

考虑到在插入新元素时需要修改两个指针:指向下一个元素的指针和指向前一个元素的指针。使用递归函数执行此操作可能会更加令人困惑。

另外,检查列表开头,列表末尾插入的特殊情况,以及列表是否为空。