【问题标题】:c warning - passing argument 1 of ‘insert’ from incompatible pointer type [duplicate]c警告-从不兼容的指针类型传递“插入”的参数1 [重复]
【发布时间】:2016-05-30 09:07:34
【问题描述】:

我是 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: 警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“inserisciTime”的参数 1

        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:警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“inserisciPosition”的参数 1

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

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

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

我的代码有什么问题?提前感谢您的帮助。

【问题讨论】:

  • 警告不是很清楚吗:“argument 1 ... incompatible pointer type”?
  • 还有十几个标题几乎相同的问题,这非常警告。这是重复的。

标签: c pointers struct insert compiler-warnings


【解决方案1】:

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

两者之一必须更改:更改函数以匹配您传递的内容,或者更改您传递的内容以匹配函数期望的内容。编译器警告在这里救了你,因为它不可能按原样工作。

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

【讨论】:

    【解决方案2】:

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

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

    此外,检查在列表开头、列表末尾以及列表是否为空的特殊情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多