Avertissement Types en conflit

Je suis nouveau en C et je ne sais pas pourquoi je pourrais avoir une erreur de types en conflit pour mes deux fonctions de numérisation. Une solution ou des suggestions pour améliorer mon code seraient grandement appréciées. Les instructions de mission sont énumérées ci-dessous.

Votre programme doit lire les informations d’un dossier comprenant la liste d’attente pour les organes, ainsi qu’une séquence d’organes reçus en vue d’un don. Votre programme doit indiquer, pour chaque organe reçu, le nom de la personne et l’organe reçu. L’organe doit aller à la personne qui a été sur la liste d’attente le plus longtemps, qui est un match pour l’organe. Aux fins de la présente cession, une correspondance est établie lorsque l’organe du donneur est identique ET que le type sanguin du donneur est identique à celui du receveur. Une fois qu’une correspondance est trouvée pour un organe, ils ne doivent plus être comparés.

Format de fichier d’entrée

La première ligne du fichier d’entrée contiendra un seul entier positif, n (n ≤ 120000), représentant le nombre d’organes sur la liste d’attente. Les n lignes suivantes contiendront des informations sur un organe chacune. Chacune de ces lignes contient le nom de la personne, l’organe à remplacer, son groupe sanguin, la date à laquelle elle a été ajoutée à la firebase database d’organes et l’heure à laquelle elle a été ajoutée à la firebase database d’organes. Chacun de ces éléments sera séparé par un espace. Tous les noms seront composés uniquement de lettres et de soulignés, tous les noms d’organes seront comparés en minuscules, tous les types de sang seront une des 8 chaînes précédemment mentionnées, toutes les dates seront du format m / j / a, où m, d , et + y, représentent le mois numérique jour et année d’ajout du patient à la liste de dons d’organes (pour cet organe en particulier). Enfin, l’heure sera de la forme hr: min, où hr (0 ≤ hr 23) et min (0 ≤ min ≤ 59) représentent l’heure et les minutes numériques correspondant au moment où le patient a été ajouté à la liste de dons d’organes. Vous avez la garantie qu’aucun des deux organes n’a été ajouté à la liste à la même date et à la même heure et qu’aucun nom ou nom d’organe ne contiendra plus de 19 caractères.

La ligne suivante du fichier d’entrée (numéro de ligne n + 2) contiendra un seul entier positif, k (k ≤ 1000) représentant le nombre d’organes reçus pendant une période donnée. Les k lignes suivantes contiendront des informations sur les organes reçus, dans leur ordre de réception. Chacune de ces lignes contiendra deux chaînes séparées par un espace: le nom de l’organe et le groupe sanguin du donneur. Ceux-ci seront tous deux conformes aux spécifications données précédemment.

Spécification de sortie

Sortie d’une seule ligne pour chaque organe reçu. S’il existe dans la firebase database un destinataire correspondant qui n’a pas encore reçu d’organe, indiquez le nom du destinataire, suivi de l’organe reçu. S’il n’y a pas de correspondance dans la firebase database, imprimez ce qui suit sur une seule ligne.

No match found 

EXEMPLE DE SORTIE:

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

EXEMPLE DE SAISIE:

 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- 

Code:

 #include  #include  #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;x0) possible=organCompare(organ, x, possible); else if (match==0) possible=x; } else continue; } if (possible>-1){ organ[possible].received=1; printf("%s %s\n",organ[possible].name, organ[possible].organname); } else printf("No match found\n"); 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; } 

Ajoutez ces trois lignes avant int main() :

  #include  void scanOrgans(int x, organT* organ); void scanDonors(int x, organT* donors ); int organCompare(organT* organ, int x, int y); 

Lorsque vous utilisez scanf avec un caractère char * vous n’avez généralement pas besoin de & , car vous avez déjà un pointeur. Alors changez:

  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); 

En outre, pas un bug en tant que tel, mais en C, vous ne devriez jamais jeter le résultat de malloc, alors changez par exemple

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

à:

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

Ce n’est pas votre problème, mais évitez la structure dans votre comparateur. Essayez ceci à la place:

 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; } 

Le compilateur se plaint parce que vous utilisez des fonctions que vous n’avez pas explicitement définies via un prototype de fonction. J’ai laissé ma référence C au travail, je ne peux donc pas trouver le paragraphe exact, mais le compilateur devinera un prototype de fonction, ce qui provoque l’avertissement ou l’erreur “types en conflit” que vous voyez. De mémoire, C suppose que les fonctions renvoient un int si vous ne spécifiez rien.

C’est ma meilleure supposition. Si la solution de David Schwartz fonctionne, je serais très sûr que c’était la cause.