c 警告 - 从不兼容的指针类型传递“插入”的参数 1
c warning - passing argument 1 of ‘insert’ from incompatible pointer type
我是 C 编程的新手。我要写一些functions/procedures的作业,然后用教授给的make test来测试
我有一个包含两个元素的结构:第一个元素是指向列表的指针,第二个元素是列表排序所依据的顺序类型。这是数据结构:
/* 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: In function ‘inserisciTime’:
raggi.c:42:27: warning: passing argument 1 of ‘inserisciTime’ from incompatible pointer type [-Wincompatible-pointer-types]
inserisciTime(l->head->next, pelem);
^
raggi.c:38:6: note: expected ‘lista_t * {aka struct *}’ but argument is of type ‘struct elem *’
void inserisciTime(lista_t * l, elem_t* pelem) {
^
raggi.c: In function ‘inserisciPosition’:
raggi.c:49:31: warning: passing argument 1 of ‘inserisciPosition’ from incompatible pointer type [-Wincompatible-pointer-types]
inserisciPosition(l->head->next, pelem);
^
raggi.c:45:6: note: expected ‘lista_t * {aka struct *}’ but argument is of type ‘struct elem *’
void inserisciPosition(lista_t * l, elem_t* pelem) {
^
我的代码有什么问题?在此先感谢您的帮助。
编译器警告几乎说明了一切。考虑第一个。 insetisciTime
期望 lista_t *
作为它的第一个参数。坏电话正在通过 l->head->next
。那是什么类型的?好吧,l
是一个 lista_t *
。所以 l->head
是一个 elem_t *
。所以l->head->next
是一个struct elem *
,相当于elem_t *
。这是类型不匹配:该函数需要 lista_t *
,而您传递的是 elem_t *
.
必须更改两者之一:更改函数以匹配您传递的内容,或者更改您传递的内容以匹配函数的期望。编译器警告将您保存在这里,因为它不可能按原样工作。
另一个警告有完全相同的问题。
错误的原因是汤姆解释的。我建议您更改函数,而不是使用递归调用(即函数调用自身),而是使用 while 循环来查找需要插入元素的位置。
考虑到插入新元素时需要修改两个指针:指向下一个元素的指针和前一个元素的指针。使用递归函数执行此操作可能会更加混乱。
此外,检查在列表开头、列表末尾以及列表是否为空的特殊情况。
我是 C 编程的新手。我要写一些functions/procedures的作业,然后用教授给的make test来测试
我有一个包含两个元素的结构:第一个元素是指向列表的指针,第二个元素是列表排序所依据的顺序类型。这是数据结构:
/* 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: In function ‘inserisciTime’:
raggi.c:42:27: warning: passing argument 1 of ‘inserisciTime’ from incompatible pointer type [-Wincompatible-pointer-types]
inserisciTime(l->head->next, pelem); ^
raggi.c:38:6: note: expected ‘lista_t * {aka struct *}’ but argument is of type ‘struct elem *’
void inserisciTime(lista_t * l, elem_t* pelem) { ^
raggi.c: In function ‘inserisciPosition’:
raggi.c:49:31: warning: passing argument 1 of ‘inserisciPosition’ from incompatible pointer type [-Wincompatible-pointer-types]
inserisciPosition(l->head->next, pelem); ^
raggi.c:45:6: note: expected ‘lista_t * {aka struct *}’ but argument is of type ‘struct elem *’
void inserisciPosition(lista_t * l, elem_t* pelem) { ^
我的代码有什么问题?在此先感谢您的帮助。
编译器警告几乎说明了一切。考虑第一个。 insetisciTime
期望 lista_t *
作为它的第一个参数。坏电话正在通过 l->head->next
。那是什么类型的?好吧,l
是一个 lista_t *
。所以 l->head
是一个 elem_t *
。所以l->head->next
是一个struct elem *
,相当于elem_t *
。这是类型不匹配:该函数需要 lista_t *
,而您传递的是 elem_t *
.
必须更改两者之一:更改函数以匹配您传递的内容,或者更改您传递的内容以匹配函数的期望。编译器警告将您保存在这里,因为它不可能按原样工作。
另一个警告有完全相同的问题。
错误的原因是汤姆解释的。我建议您更改函数,而不是使用递归调用(即函数调用自身),而是使用 while 循环来查找需要插入元素的位置。
考虑到插入新元素时需要修改两个指针:指向下一个元素的指针和前一个元素的指针。使用递归函数执行此操作可能会更加混乱。
此外,检查在列表开头、列表末尾以及列表是否为空的特殊情况。