警告冲突类型

  • 本文关键字:类型 冲突 警告 c
  • 更新时间 :
  • 英文 :


我是 C 语言的新手,我不知道为什么我的两个扫描功能都会出现冲突的类型错误。解决方案或任何改进我的代码的建议将不胜感激。分配方向如下。

程序应读入包含以下内容的文件的信息 器官等待名单,以及收到的器官序列 捐赠。对于收到的每个器官,您的程序应打印出 该人的姓名和他们收到的器官。器官应 转到候补名单上时间最长的人,他是 器官的匹配。就本作业而言,匹配项 当供体器官相同且供体的血型相同时发生 与收件人相同。一旦找到器官的匹配项,他们 不应再次匹配。

输入文件格式

输入文件的第一行将包含一个正整数 n(n ≤ 120000),表示等待名单上的器官数量。接下来的 n 行将包含信息 每个大约一个器官。这些行中的每一行都将包含此人的 姓名,他们需要更换的器官,他们的血型,他们的日期 被添加到器官数据库中以及它们被添加到 器官数据库。这些项目中的每一个都将用空格分隔。都 名称将仅由字母和下划线组成,所有器官 名称将由小写字母比较,所有血型均为 前面提到的 8 个字符串之一,所有日期都将是 格式 m/d/y,其中 m、d 和 +y 表示数字月日和 患者被添加到器官捐赠名单的年份(为此 特定器官)。最后,时间的形式将是 hr:min,其中 hr(0 ≤ hr ≤ 23) 和 min(0 ≤ min ≤ 59) 表示数字小时和 患者被添加到器官捐赠列表的时间分钟数。 您可以保证没有两个器官被添加到列表中的列表中 相同的日期和时间,并且没有名称或器官名称将包含更多 超过 19 个字符。

输入文件的以下行(行号 n+2)将包含 单个正整数,k (k ≤ 1000) 表示 在某个固定的时间段内接受的器官。以下 k 行将包含有关收到的器官的信息,按顺序 他们收到了。其中每一行都将包含两个字符串 用空格分隔:器官的名称和血型 施主。这些都将符合先前给出的规格。

输出规格

为收到的每个器官输出一行。如果数据库中存在尚未收到器官的匹配收件人,请打印出收件人的姓名,后跟 他们收到的器官。如果数据库中不存在匹配项,请打印输出 以下在一行上。

No match found

示例输出:

Adam_Smith kidney
Jessica_Arte liver
Shelly_Zenith liver
No match found
No match found
John_Lynch kidney

示例输入:

10
John_Lynch kidney A- 12/13/2007 14:43
Beth_Silva lung O+ 1/23/2009 13:10
Adam_Smith kidney A- 12/13/2007 9:59
Jenn_Gray liver AB+ 9/9/1999 1:23
Sylvia_Maria lung O+ 1/24/2009 0:09
Sean_Stark heart AB- 8/23/2000 9:13
Shelly_Zenith liver AB- 9/10/1999 1:13
Jessica_Arte liver AB+ 8/31/1999 23:38
Bill_Muse heart O+ 3/23/2013 3:12
Samantha_Bogedon intestine B- 6/30/2012 17:08
6
kidney A-
liver AB+
liver AB-
heart O-
intestine A+
kidney A-

法典:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
#define BLOODTYPESIZE 4
//Structure to store month day and year
typedef struct {
    int month;
    int day;
    int year;
} dateT;
// Structure to stores hour and minute
typedef struct {
    int hour;
    int minute;
} timeT;
// structure to store name organname bloodtype dateadded time added and whether or not it was received
typedef struct {
    char name[SIZE];
    char organname[SIZE];
    char bloodtype[BLOODTYPESIZE];
    dateT dateAdded;
    timeT timeAdded;
    int received;
} organT;
int main(){
    //Declare variables
    int numberOfOrgans,x,numberOfDonors,y,match,possible;
// Create pointer to structure
organT* organ;
scanf("%d",&numberOfOrgans);
organ = (organT *)malloc(numberOfOrgans*sizeof(organT));
scanOrgans(numberOfOrgans,organ);
scanf("%d",&numberOfDonors);
organT* donors;
donors = (organT *)malloc(numberOfDonors*sizeof(organT));
scanDonors(numberOfDonors, donors);
for(y=0;y<numberOfDonors;y++){
    match=-1;
    possible=-1;
    for(x=0;x<numberOfOrgans;x++){
        if((strcmp(organ[x].organname, donors[y].organname)==0) && (strcmp(organ[x].bloodtype, donors[y].bloodtype)==0) && (organ[x].received!=1)){
           match++;
            if (match>0)
                possible=organCompare(organ, x, possible);
            else if (match==0)
                possible=x;
            }
        else continue;
    }
    if (possible>-1){
        organ[possible].received=1;
        printf("%s %sn",organ[possible].name, organ[possible].organname);
    }
    else
        printf("No match foundn");
        free(organ);
        free(donors);
    }
}
void scanOrgans(int x,organT* organ){
    int i;
    char temp[256];
    for(i=0;i<x;i++){
        scanf("%s",&organ[i].name);
        scanf("%s",&organ[i].organname);
        scanf("%s",&organ[i].bloodtype);
        scanf("%s",&temp);
        sscanf(temp,"%d/%d/%d",&organ[i].dateAdded.month,&organ[i].dateAdded.day,&organ[i].dateAdded.year);
        scanf("%s",&temp);
        sscanf(temp,"%d:%d",&organ[i].timeAdded.hour,&organ[i].timeAdded.minute);
   }
}
void scanDonors(int x, organT* donors ){
    int i;
    for(i=0;i<x;i++){
    scanf("%s%s", &donors[i].organname, &donors[i].bloodtype);
    }
}
int organCompare(organT* organ, int x, int y){
    if (organ[x].dateAdded.year<organ[y].dateAdded.year)
        return x;
    else if(organ[x].dateAdded.year==organ[y].dateAdded.year){
        if (organ[x].dateAdded.month<organ[y].dateAdded.month)
            return x;
        else if(organ[x].dateAdded.month==organ[y].dateAdded.month){
            if (organ[x].dateAdded.day<organ[y].dateAdded.day)
            return x;
            else if (organ[x].dateAdded.day==organ[y].dateAdded.day){
                if (organ[x].timeAdded.hour<organ[y].timeAdded.hour)
                return x;
                else if (organ[x].timeAdded.hour==organ[y].timeAdded.hour){
                    if (organ[x].timeAdded.minute<organ[y].timeAdded.minute)
                    return x;
                    else return y;
                    }
                else return y;
            }
            else return y;
        }
        else return y;
        }
    else return y;
    }

int main()之前添加以下三行:

 #include <string.h>
 void scanOrgans(int x, organT* organ);  
 void scanDonors(int x, organT* donors );
 int organCompare(organT* organ, int x, int y);

当将scanfchar *一起使用时,通常不需要&,因为您已经有一个指针。所以改变:

    scanf("%s",&organ[i].name);
    scanf("%s",&organ[i].organname);
    scanf("%s",&organ[i].bloodtype);

自:

    scanf("%s",organ[i].name);
    scanf("%s",organ[i].organname);
    scanf("%s",organ[i].bloodtype);

另外,这不是这样的错误,但在 C 中,您永远不应该强制转换 malloc 的结果,因此请更改例如

donors = (organT *)malloc(numberOfDonors*sizeof(organT));

自:

donors = malloc(numberOfDonors*sizeof(organT));

这不是你的问题,但请避免比较器中的结构。 试试这个:

int organCompare(organT* organ, int x, int y)
{
    if (organ[x].dateAdded.year < organ[y].dateAdded.year)
        return x;
    else if (organ[x].dateAdded.year > organ[y].dateAdded.year)
        return y;
    else if (organ[x].dateAdded.month < organ[y].dateAdded.month)
        return x;
    else if (organ[x].dateAdded.month < organ[y].dateAdded.month)
        return y;
    else if (organ[x].dateAdded.day < organ[y].dateAdded.day)
        return x;
    else if (organ[x].dateAdded.day > organ[y].dateAdded.day)
        return y;
    else if (organ[x].timeAdded.hour < organ[y].timeAdded.hour)
        return x;
    else if (organ[x].timeAdded.hour > organ[y].timeAdded.hour)
        return y;
    else if (organ[x].timeAdded.minute < organ[y].timeAdded.minute)
        return x;
    else
        return y;
}

编译器抱怨,因为您使用的是未通过函数原型显式定义的函数。我把我的 C 引用留在了工作中,所以我找不到确切的段落,但编译器会猜测函数原型,这会导致您看到的"冲突类型"警告或错误。从内存中,C 假定函数在未指定任何内容时返回int

这是我最好的猜测。如果大卫·施瓦茨的修复有效,我会非常确定这是原因。

最新更新