Текущий код:
struct Date{ // (1)
unsigned int year, month, day;
} Date; // (2)
Создает структуру (тип) с именем Date
в (1), а экземпляр этой структуры также называется Date
в (2). Экземпляр структуры будет shadow тип с тем же именем, что является причиной этой проблемы.
Судя по всему, вам не нужно, чтобы экземпляр Date
определялся глобально. Вы должны иметь возможность переместить экземпляр в main
, который изменит это так:
struct Date{
unsigned int year, month, day;
};
...
int main()
{
Date date;
Date* ptr = &date; // you can even avoid this step, and just do readDate(&date) directly
readDate(ptr);
...
}
В противном случае код:
void readDate(Date* d) {
будет обрабатывать идентификатор Date
как экземпляр типа Date
, но не как сам тип Date
- что приводит к сбивающим с толку ошибкам, с которыми вы сталкиваетесь.
Если экземпляр Date
необходимо определить глобально, то в идеале вы должны дать ему имя, отличное от типа (например, struct Date { ... } date;)
. Если это невозможно, вам придется префиксировать все варианты использования типа с struct
, чтобы устранить неоднозначность, как:
void readDate(struct Date* d) {
Если проф дал вам код, который имеет:
struct Date {
...
} Date;
void readDate(Date* d) {
...
}
Тогда они, должно быть, дали вам неработающий код, поскольку - как я описал выше - - это не юридический код без некоторых изменений кода.