ошибка: конфликтующие типы, ошибка: тип формального параметра 2 является неполным - PullRequest
0 голосов
/ 16 декабря 2018

Я пишу код, который вычисляет разницу в днях между двумя указанными датами.Обратите внимание, что каждый месяц считается равным 30 дням, а каждый год равен 360 дням.

Я получаю следующее предупреждение / ошибки и, похоже, не понимаю, почему:

Предупреждение и ошибки

Вот мой код:

#include <stdio.h>

int dif_days(struct Date Date1, struct Date Date2);

struct Date
{
    int Day;
    int Month;
    int Year;
};

int main()
{
    struct Date Date1;
    struct Date Date2;

    printf("\n Please enter the first date: ");
    scanf("%d %d %d ", &Date1.Day, &Date1.Month, &Date1.Year);

    printf("\n Please enter the second date: ");
    scanf("%d %d %d ", &Date2.Day, &Date2.Month, &Date2.Year);

    int diff = dif_days(Date1, Date2);
    printf("\n The difference in days is: %d \n", diff);

    return 0;
}

int dif_days(struct Date Date1, struct Date Date2)
{
    // variable declaration 
    int difference;
    int Day, Month, Year; // The final days/months/years

    // for the days
    if (Date1.Day > Date2.Day)
        Day = Date1.Day - Date2.Day;
    else    
        Day = Date2.Day - Date1.Day;

    // for the months
    if (Date1.Month > Date2.Month) 
        Month = Date1.Month - Date2.Month;
    else
        Month = Date2.Month - Date1.Month;

    // for the years
    if (Date1.Year > Date2.Year)
        Year = Date1.Year - Date2.Year;
    else        
        Year = Date2.Year - Date1.Year;       

    difference = Day + Month*30 + Year*360;                

    return difference;
}

1 Ответ

0 голосов
/ 16 декабря 2018

Вам нужно объявить struct Date, прежде чем использовать его в прототипе функции для dif_days().

. Вы можете переместить все определение struct так, чтобы оно предшествовало прототипу функции,или вы можете использовать прямое объявление для struct, добавив перед прототипом функции:

struct Date;

Кроме того, вам необходимо удалить завершающие пробельные символы из строк формата scanf(). Это портит интерактивный ввод и не делает того, что люди обычно ожидают. Обратите внимание, что директива %d автоматически игнорирует начальные пробельные символы и фактически единственные директивы scanf(), которые не игнорируйте начальные пробелы %c, %n и %[].

И пока мы обсуждаем scanf(), вы должны проверить значение, возвращаемое вызовамидо scanf(), чтобы убедиться, что ввод соответствует ожидаемому.Как только совпадение в строке форматирования завершится неудачно, scanf() перейдет без сохранения чего-либо в оставшихся переменных.Неверные вводы приведут к неопределенному поведению, когда код попытается использовать неопределенные значения.Здесь scanf() вернет 3, если введены три числа, и для базовой проверки вы можете проверить, действительно ли пользователь ввел три числа, прежде чем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...