首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C警告-从不兼容的指针类型传递“插入”的参数1

C警告-从不兼容的指针类型传递“插入”的参数1
EN

Stack Overflow用户
提问于 2016-05-30 09:07:34
回答 2查看 3.1K关注 0票数 2

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

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

代码语言:javascript
复制
/* 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;

我必须根据顺序类型将一个元素(通过输入)插入到列表中。这是我的代码:

代码语言:javascript
复制
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;
    }
}

在做测试时,我会收到这样的警告:

C:在函数“插入时间”中: raggi.c:42:27:警告:从不兼容的指针类型传递‘inserisciTime’的参数1- type兼容-指针-类型 inserisciTime(l->head->next,pelem);^ raggi.c:38:6:注意:预期的‘lista_t*{又名结构*}’,但参数的类型是‘struct *’。 void inserisciTime(lista_t * l,elem_t* pelem) {^ 在函数“插入位置”中: raggi.c:49:31:警告:从不兼容的指针类型传递‘inserisciPosition’的参数1- type兼容-指针-类型 inserisciPosition(l->head->next,pelem);^ raggi.c:45:6:注意:预期的‘lista_t*{又名结构*}’,但参数的类型是‘struct *’。 void inserisciPosition(lista_t * l,elem_t* pelem) {^

我的密码怎么了?提前感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-30 09:35:11

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-05-30 09:14:03

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

两者之一必须更改:要么更改函数以匹配您要传递的内容,要么更改传递的内容以满足函数的要求。编译器警告将您保存在这里,因为它不可能按原样工作。

另一个警告也有同样的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37521748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档