调度程序.c 我正在为类(class)制定日程安排程序,但我遇到了这个错误。它表示类型“int”与“Ev”类型不兼容。我很困惑这可能意味着什么。
int main()
{
Ev *event;
int numEvents=0;
int option;
int x;
int y;
char menu[]="1 - Insert a new event\n2 - Display all events\n3 - Now?\n4 - Delete expired\n0 - Exit\nPlease select an option: ";
event = malloc(sizeof(Ev) *numEvents);
CopynumEvents(&numEvents);
for (y=0; y<numEvents; y++)
{
event = realloc(event, sizeof(Ev) * (y + 1));
**MY ERROR SEEMS TO BE AROUND THIS AREA**
event[y]=CopyfromFile(numEvents,y);
}
option = MenuOption(menu);
while(1)
{
switch(option)
{
case(1):
event = realloc(event, sizeof(Ev) * (numEvents + 1));
numEvents++;
event[numEvents - 1]=InsertEvent();
ArrangeEvents(event,numEvents);
CopytoFile(numEvents, event);
option = MenuOption(menu);
break;
case(2):
if (numEvents!=0)
{
for (x=0; x<numEvents; x++)
{
DisplayEvent(event[x]);
}
}
else
{
printf("No event in scheduler\n");
}
option = MenuOption(menu);
break;
case(3):
ActiveEvents(event, numEvents);
option = MenuOption(menu);
break;
case(4):
DeleteExpired(event, &numEvents);
CopytoFile(numEvents, event);
option = MenuOption(menu);
break;
case(0):
free(event);
exit(1);
break;
}
}
}
int MenuOption(char *prompt)
{
char buffer[100];
int option;
do
{
printf("%s", prompt);
/* Get a line of up to 100 characters */
fgets(buffer, sizeof(buffer), stdin);
/* Remove any \n we may have input */
if(strlen(buffer) > 0)
buffer[strlen(buffer)-1] = '\0';
sscanf(buffer, "%d", &option);
}while(option!=1 && option!=2 && option!=3 && option!=4 && option!=0);
return option;
}
struct Event InsertEvent()
{
struct Event E1;
printf("What is the event: ");
InputEventname(E1.name, sizeof(E1.name));
E1.date = InputDate("Event date: ");
E1.start = InputTime("Start time: ",E1.date);
do
{
E1.end = InputTime("End time: ",E1.date);
}while(E1.end<=E1.start);
return E1;
}
void InputEventname(char *str, int max)
{
char buffer[100];
/* Get a line of up to 100 characters */
fgets(buffer, sizeof(buffer), stdin);
/* Remove any \n we may have input */
if(strlen(buffer) > 0)
buffer[strlen(buffer)-1] = '\0';
/* Copy up to max characters to our string */
strncpy(str, buffer, max);
str[max-1] = '\0';
}
time_t InputTime(char *prompt, time_t date)
{
char buffer[100];
char *result;
struct tm time;
time = *localtime(&date);
do
{
printf("%s", prompt);
/* Get a line of up to 100 characters */
fgets(buffer, sizeof(buffer), stdin);
/* Remove any \n we may have input */
if(strlen(buffer) > 0)
buffer[strlen(buffer)-1] = '\0';
result = strptime(buffer, "%I:%M%p", &time);
} while(result == NULL);
return mktime(&time);
}
time_t InputDate(char *prompt)
{
char buffer[100];
char *result;
struct tm date;
do
{
printf("%s", prompt);
/* Get a line of up to 100 characters */
fgets(buffer, sizeof(buffer), stdin);
/* Remove any \n we may have input */
if(strlen(buffer) > 0)
buffer[strlen(buffer)-1] = '\0';
result = strptime(buffer, "%m/%d/%Y", &date);
} while(result == NULL);
/* Convert to time_t format */
date.tm_min = 0;
date.tm_hour = 0;
date.tm_sec = 0;
date.tm_isdst = 1;
return mktime(&date);
}
这是我的标题。我相信我已经正确完成了这部分
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#include <string.h>
#define __USE_XOPEN
#include <time.h>
#include "scheduler.h"
/*
* This is my scheduling program!!
*/
/* Our possible scheduling states */
#define NewEvent 1
#define AllEvents 2
#define Now 3
#define Expired 4
#define Exit 0
#ifndef DISPLAY_H
#define DISPLAY_H
typedef struct Event
{
char name[50];
time_t date;
time_t start;
time_t end;
int y;
}Ev;
int MenuOption(char *prompt);
struct Event InsertEvent();
void InputEventname(char *str, int max);
time_t InputDate(char *prompt);
time_t InputTime(char *prompt, time_t date);
void DisplayEvent(Ev event);
#endif
最佳答案
宏__USE_XOPEN
是一个内部名称;它不应该由你设置。您应该使用 #define _XOPEN_SOURCE 700
或类似的值(500、600 或 700)。此外,它应该在包含任何 POSIX header 之前设置。标准 C 头文件也是 POSIX 头文件。
您应该在问题中给出确切的错误消息(文件的路径名除外,如果它们长于大约 20 个字符;将它们缩减为基本名称)。信息的一个关键组成部分是行号;您应该在文件中标识该行,除非它是第 1 行(可能一直到第 10 行,但如果您不标记有错误的行,则不要省略任何行)。
既然你说编译器警告:
incompatible types to type 'Ev' from type 'int'
您可能会遇到 malloc()
和 realloc()
未声明的问题,或者可能是 CopyfromFile()
这是未声明。如果在使用函数之前未声明该函数,C 编译器将假定它返回一个 int
— 这对于 C89 和准标准 C 来说是正确的。严格来说,对于 C99 或 C11,编译器应该拒绝编译,但大多数人不会这样做,除非您告诉他们这样做。
如果您使用 GCC 进行编译,请使用严格的警告选项 — 特别是警告您缺少原型(prototype)。我使用:
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition -Werror …
您也可以使用 -Wold-style-declaration
,或者改为使用,并且某些(较旧)版本的 GCC 可能不支持 -Wold-style-*
选项。如果您的代码使用这些选项可以干净地编译,则可以避免很多问题。
关于c - 第 50 行从类型 'Ev' 到类型 'int' 的不兼容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305264/