警告:使用 gcc -std=c89 -g –pedantic filename.c 编译时从不兼容的指针类型赋值
warning: assignment from incompatible pointer type when compiling using gcc -std=c89 -g –pedantic filename.c
我正在使用链表实现队列。需要使用命令 gcc -std=c89 -g –pedantic filename.c 在 omega 上编译代码而不发出警告。但是,我收到警告:行号(174、223、253)上的不兼容指针类型赋值 [默认启用]。另外,我在将记录打印到文件时遇到问题:
#include <stdio.h>
#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
struct student_record
{
int student_id_;
int student_age_;
char first_name_[21];
char last_name_[21];
};
struct student_record_node
{
struct student_record* record_;
struct student_record_node* next_;
}*front,*rear,*temp,*front1;
void enq(struct student_record* sr);
void parseFile(char* filename, struct student_record_node** head);
void printNode(struct student_record_node* node);
struct student_record_node* student_record_allocate();
void student_record_node_deallocate(struct student_record_node* node);
void sortByAge(struct student_record_node** recordsHead);
void sortById(struct student_record_node** front);
void swap(struct student_record_node** node1, struct student_record_node** node2);
int main ( int argc, char *argv[] )
{
char *filename = argv[1];
int i;
/**for(i=0;i<argc;i++)**/
/** printf("%d %s ",i,argv[i]);**/
/**printf( "usage: %s filename", argv[1] );**/
parseFile(filename,&front);
printNode(front);
printf("\n");
printf("Sorting by age \n");
sortByAge(&front);
printNode(front);
printf("Sorting by id \n");
sortById(&front);
printNode(front);
/**student_record_node_deallocate(front);**/
getch();
return 0;
}
void swap(struct student_record_node** node1, struct student_record_node** node2)
{
struct student_record *s1;
struct student_record_node *t1 = *node1,*t2=*node2;
/**s1=(struct node *)malloc(1*sizeof(struct student_record));**/
s1= t1 -> record_;
t1->record_= t2->record_;
t2->record_=s1;
}
void sortByAge(struct student_record_node** front)
{
int swapped, i;
struct student_record_node *ptr1;
struct student_record_node *lptr = NULL;
struct student_record *s1,*s2;
/**Checking for empty list**/
if (ptr1 == NULL)
return;
do
{
swapped = 0;
ptr1 = *front;
while (ptr1->next_ != lptr)
{
s1=ptr1->record_;
s2=ptr1->next_->record_;
if (s1->student_age_ > s2->student_age_)
{
swap(&ptr1, &ptr1->next_);
swapped = 1;
}
ptr1 = ptr1->next_;
}
lptr = ptr1;
}
while (swapped);
}
void sortById(struct student_record_node** front)
{
int swapped, i;
struct student_record_node *ptr1;
struct student_record_node *lptr = NULL;
struct student_record *s1,*s2;
/**Checking for empty list**/
if (ptr1 == NULL)
return;
do
{
swapped = 0;
ptr1 = *front;
while (ptr1->next_ != lptr)
{
s1=ptr1->record_;
s2=ptr1->next_->record_;
if (s1->student_id_ > s2->student_id_)
{
swap(&ptr1, &ptr1->next_);
swapped = 1;
}
ptr1 = ptr1->next_;
}
lptr = ptr1;
}
while (swapped);
}
void student_record_node_deallocate(struct student_record_node* node)
{
front1 = node;
struct student_record_node* temp;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
temp =front1;
front1 = front1->next_;
free(temp);
}
if (front1 == rear)
{
free(front1);
}
free(node);
free(temp);
}
struct student_record_node* student_record_allocate()
{
struct student_record_node* sr;
sr = (struct node *)malloc(1*sizeof(struct student_record_node));
return sr;
}
void printNode(struct student_record_node* node)
{
front1 = front;
struct student_record* s;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
s=front1->record_;
printf("struct student_record_node\n");
printf("\tstudent firstname %s\n", s->first_name_);
printf("\tstudent lastname %s\n", s->last_name_);
printf("\tstudent id %d\n", s->student_id_);
printf("\tstudent age %d\n\n", s->student_age_);
front1 = front1->next_;
}
if (front1 == rear)
{
s=front1->record_;
printf("struct student_record_node\n");
printf("\tstudent firstname %s\n", s->first_name_);
printf("\tstudent lastname %s\n", s->last_name_);
printf("\tstudent id %d\n", s->student_id_);
printf("\tstudent age %d\n\n", s->student_age_);
}
}
void enq(struct student_record* sr)
{
if (rear == NULL)
{
rear = student_record_allocate();//(struct node *)malloc(1*sizeof(struct student_record_node));
rear->record_ = sr;
rear->next_ = NULL;
front = rear;
}
else
{
temp=(struct node *)malloc(1*sizeof(struct student_record_node));
rear->next_ = temp;
temp->record_ = sr;
temp->next_ = NULL;
rear = temp;
}
}
void parseFile(char* filename, struct student_record_node** head)
{
struct student_record * sr;
char item[21], status[21];
int id,age;
FILE *fp;
if((fp = fopen(filename, "r+")) == NULL) {
printf("No such file\n");
exit(1);
}
while (true) {
int ret = fscanf(fp, "%s %s %d %d", item, status, &id, &age);
if(ret == 4)
{
/**printf("\n%s \t %s %d %d", item, status, id, age);**/
sr = (struct node *)malloc(1*sizeof(struct student_record));
strncpy(sr->first_name_, item, 21);
/**sr->first_name_ = item;**/
strncpy(sr->last_name_,status,21);
/**sr->last_name_ = status;**/
sr->student_id_=id;
sr->student_age_=age;
enq(sr);
}
else if(errno != 0) {
perror("scanf:");
break;
} else if(ret == EOF) {
break;
} else {
printf("No match.\n");
}
}
printf("\n");
/*if(feof(fp)) {
puts("EOF");
}*/
}
输入文件是:
Joe Smith 00001 24
Bob Smith 00002 31
Samantha Smith 00003 30
Christina Smith 00004 17
Steven Smith 00005 20
Jason Smith 00006 3
Patrick Smith 00007 50
Alex Smith 00001 29
你永远不应该使用 malloc 的 return。 See this link as to why should not.
所以,更改第 174 行的代码。
sr = (struct node *)malloc(1*sizeof(struct student_record_node));
到
sr = malloc(1*sizeof(struct student_record_node));
对所有三个重复此操作 lines.Other 然后排序似乎没问题。
要打印到文件,您可以使用函数 fprintf(fp,"....")
而不是使用 printf
它是 (mmm...) 因为您正在分配一个不兼容的指针类型。
struct student_record_node* sr;
sr = (struct node *)malloc(1*sizeof(struct student_record_node));
在这里,您将 malloc
的 return 值转换为 "pointer to struct node",然后将其分配给 "pointer to struct student_record_node."
其实演员阵容很烂。扔掉它。 malloc
的return值为void*
,与任何其他指针兼容。此外,您可以使用位置作为 sizeof
的参数,这有很多好处。 1*
只是混乱。所以你剩下:
struct student_record_node *sr = malloc(sizeof *sr);
错误将消失。
然后检查 NULL return 值。就算是玩具,也要早点养成真正程序员的习惯。
此外,学习 c89
语法也不是最好的主意,尤其是作为新程序员。在非平凡的情况下,它实际上需要糟糕的风格。为什么你认为 gcc
需要一个标志来强制它?我知道这可能超出了你的控制范围,但我会向老师提出。
"Facing problems" 不是问题。如果您需要特定的帮助,通常可以在这里找到。
检查这一行
if (ptr1 == NULL)
return;
应该是 "front" 代替 "ptr"
我正在使用链表实现队列。需要使用命令 gcc -std=c89 -g –pedantic filename.c 在 omega 上编译代码而不发出警告。但是,我收到警告:行号(174、223、253)上的不兼容指针类型赋值 [默认启用]。另外,我在将记录打印到文件时遇到问题:
#include <stdio.h>
#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
struct student_record
{
int student_id_;
int student_age_;
char first_name_[21];
char last_name_[21];
};
struct student_record_node
{
struct student_record* record_;
struct student_record_node* next_;
}*front,*rear,*temp,*front1;
void enq(struct student_record* sr);
void parseFile(char* filename, struct student_record_node** head);
void printNode(struct student_record_node* node);
struct student_record_node* student_record_allocate();
void student_record_node_deallocate(struct student_record_node* node);
void sortByAge(struct student_record_node** recordsHead);
void sortById(struct student_record_node** front);
void swap(struct student_record_node** node1, struct student_record_node** node2);
int main ( int argc, char *argv[] )
{
char *filename = argv[1];
int i;
/**for(i=0;i<argc;i++)**/
/** printf("%d %s ",i,argv[i]);**/
/**printf( "usage: %s filename", argv[1] );**/
parseFile(filename,&front);
printNode(front);
printf("\n");
printf("Sorting by age \n");
sortByAge(&front);
printNode(front);
printf("Sorting by id \n");
sortById(&front);
printNode(front);
/**student_record_node_deallocate(front);**/
getch();
return 0;
}
void swap(struct student_record_node** node1, struct student_record_node** node2)
{
struct student_record *s1;
struct student_record_node *t1 = *node1,*t2=*node2;
/**s1=(struct node *)malloc(1*sizeof(struct student_record));**/
s1= t1 -> record_;
t1->record_= t2->record_;
t2->record_=s1;
}
void sortByAge(struct student_record_node** front)
{
int swapped, i;
struct student_record_node *ptr1;
struct student_record_node *lptr = NULL;
struct student_record *s1,*s2;
/**Checking for empty list**/
if (ptr1 == NULL)
return;
do
{
swapped = 0;
ptr1 = *front;
while (ptr1->next_ != lptr)
{
s1=ptr1->record_;
s2=ptr1->next_->record_;
if (s1->student_age_ > s2->student_age_)
{
swap(&ptr1, &ptr1->next_);
swapped = 1;
}
ptr1 = ptr1->next_;
}
lptr = ptr1;
}
while (swapped);
}
void sortById(struct student_record_node** front)
{
int swapped, i;
struct student_record_node *ptr1;
struct student_record_node *lptr = NULL;
struct student_record *s1,*s2;
/**Checking for empty list**/
if (ptr1 == NULL)
return;
do
{
swapped = 0;
ptr1 = *front;
while (ptr1->next_ != lptr)
{
s1=ptr1->record_;
s2=ptr1->next_->record_;
if (s1->student_id_ > s2->student_id_)
{
swap(&ptr1, &ptr1->next_);
swapped = 1;
}
ptr1 = ptr1->next_;
}
lptr = ptr1;
}
while (swapped);
}
void student_record_node_deallocate(struct student_record_node* node)
{
front1 = node;
struct student_record_node* temp;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
temp =front1;
front1 = front1->next_;
free(temp);
}
if (front1 == rear)
{
free(front1);
}
free(node);
free(temp);
}
struct student_record_node* student_record_allocate()
{
struct student_record_node* sr;
sr = (struct node *)malloc(1*sizeof(struct student_record_node));
return sr;
}
void printNode(struct student_record_node* node)
{
front1 = front;
struct student_record* s;
if ((front1 == NULL) && (rear == NULL))
{
printf("Queue is empty");
return;
}
while (front1 != rear)
{
s=front1->record_;
printf("struct student_record_node\n");
printf("\tstudent firstname %s\n", s->first_name_);
printf("\tstudent lastname %s\n", s->last_name_);
printf("\tstudent id %d\n", s->student_id_);
printf("\tstudent age %d\n\n", s->student_age_);
front1 = front1->next_;
}
if (front1 == rear)
{
s=front1->record_;
printf("struct student_record_node\n");
printf("\tstudent firstname %s\n", s->first_name_);
printf("\tstudent lastname %s\n", s->last_name_);
printf("\tstudent id %d\n", s->student_id_);
printf("\tstudent age %d\n\n", s->student_age_);
}
}
void enq(struct student_record* sr)
{
if (rear == NULL)
{
rear = student_record_allocate();//(struct node *)malloc(1*sizeof(struct student_record_node));
rear->record_ = sr;
rear->next_ = NULL;
front = rear;
}
else
{
temp=(struct node *)malloc(1*sizeof(struct student_record_node));
rear->next_ = temp;
temp->record_ = sr;
temp->next_ = NULL;
rear = temp;
}
}
void parseFile(char* filename, struct student_record_node** head)
{
struct student_record * sr;
char item[21], status[21];
int id,age;
FILE *fp;
if((fp = fopen(filename, "r+")) == NULL) {
printf("No such file\n");
exit(1);
}
while (true) {
int ret = fscanf(fp, "%s %s %d %d", item, status, &id, &age);
if(ret == 4)
{
/**printf("\n%s \t %s %d %d", item, status, id, age);**/
sr = (struct node *)malloc(1*sizeof(struct student_record));
strncpy(sr->first_name_, item, 21);
/**sr->first_name_ = item;**/
strncpy(sr->last_name_,status,21);
/**sr->last_name_ = status;**/
sr->student_id_=id;
sr->student_age_=age;
enq(sr);
}
else if(errno != 0) {
perror("scanf:");
break;
} else if(ret == EOF) {
break;
} else {
printf("No match.\n");
}
}
printf("\n");
/*if(feof(fp)) {
puts("EOF");
}*/
}
输入文件是:
Joe Smith 00001 24
Bob Smith 00002 31
Samantha Smith 00003 30
Christina Smith 00004 17
Steven Smith 00005 20
Jason Smith 00006 3
Patrick Smith 00007 50
Alex Smith 00001 29
你永远不应该使用 malloc 的 return。 See this link as to why should not.
所以,更改第 174 行的代码。
sr = (struct node *)malloc(1*sizeof(struct student_record_node));
到
sr = malloc(1*sizeof(struct student_record_node));
对所有三个重复此操作 lines.Other 然后排序似乎没问题。
要打印到文件,您可以使用函数 fprintf(fp,"....")
而不是使用 printf
它是 (mmm...) 因为您正在分配一个不兼容的指针类型。
struct student_record_node* sr;
sr = (struct node *)malloc(1*sizeof(struct student_record_node));
在这里,您将 malloc
的 return 值转换为 "pointer to struct node",然后将其分配给 "pointer to struct student_record_node."
其实演员阵容很烂。扔掉它。 malloc
的return值为void*
,与任何其他指针兼容。此外,您可以使用位置作为 sizeof
的参数,这有很多好处。 1*
只是混乱。所以你剩下:
struct student_record_node *sr = malloc(sizeof *sr);
错误将消失。
然后检查 NULL return 值。就算是玩具,也要早点养成真正程序员的习惯。
此外,学习 c89
语法也不是最好的主意,尤其是作为新程序员。在非平凡的情况下,它实际上需要糟糕的风格。为什么你认为 gcc
需要一个标志来强制它?我知道这可能超出了你的控制范围,但我会向老师提出。
"Facing problems" 不是问题。如果您需要特定的帮助,通常可以在这里找到。
检查这一行
if (ptr1 == NULL)
return;
应该是 "front" 代替 "ptr"