我無法弄清楚爲什麼gcc認爲我試圖給一個結構類型分配一個整數。下面的代碼是嘗試將其他較短代碼的功能組合起來,這些代碼編譯和工作得很好。與從函數返回結構類型有關的錯誤
#include <stdio.h>
#include <stdbool.h>
struct date
{
int month;
int day;
int year;
};
struct time {
int hour;
int minutes;
int seconds;
};
struct dateAndTime {
struct date combinedDate;
struct time combinedTime;
};
void clockKeeper(struct dateAndTime dtAnTm)
{
//struct time testTime [] = { { 11, 59, 59 } , {12, 00, 00} , {1, 29, 59} , {23, 59, 59} , {19, 12, 27} };
struct time testTime[] = {
{.hour = 11, .minutes = 59, .seconds = 59},
{.hour = 12, .minutes = 00, .seconds = 00},
{.hour = 1, .minutes = 29, .seconds = 59},
{.hour = 23, .minutes = 59, .seconds = 59},
{.hour = 19, .minutes = 12, .seconds = 27}
};
int i;
struct time midNight = { 12, 00, 00};
printf ("Here is what is in Midnight :%i:%i:%i \n", midNight.hour, midNight.minutes, midNight.seconds);
for (i = 0; i < 5; i++)
{
printf("Time is: %.2i:%.2i:%.2i\n", testTime[i].hour, testTime[i].minutes, testTime[i].seconds);
testTime[i] = timeUpdate (testTime[i]);
printf("....one second later%.2i:%.2i:%.2i\n", testTime[i].hour, testTime[i].minutes, testTime[i].seconds);
//if (testTime[i].hour > midNight.hour)
// testTime[i]= dateUpdate (testTime[i]);
}
}
struct time timeUpdate (struct time now)
{
++now.seconds;
if (now.seconds == 60) { // next minute
now.seconds = 0;
++now.minutes;
if (now.minutes == 60) {
now.minutes = 0;
now.hour++;
if (now.hour == 24) // midnight
now.hour = 0;
}
}
return now;
}
struct date dateUpdate (struct date today)
{
struct date tomorrow;
int numberOfDays (struct date d);
if (today.day != numberOfDays (today)) {
tomorrow.day = today.day + 1;
tomorrow.month = today.month;
tomorrow.year = today.year;
}
else if (today.month == 12) {
tomorrow.day = 1;
tomorrow.month = 1;
tomorrow.year = today.year + 1;
}
else {
tomorrow.day = 1;
tomorrow.month = today.month + 1;
tomorrow.year = today.year;
}
return tomorrow;
}
int numberOfDays (struct date d)
{
int days;
bool isLeapYear (struct date d);
const int daysPerMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear (d) == true && d.month == 2)
days = 29;
else
days = daysPerMonth[d.month - 1];
return days;
}
// Function to determine if it's a leap year
bool isLeapYear (struct date d)
{
bool leapYearFlag;
if ((d.year % 4 == 0 && d.year % 100 !=0) || d.year % 400 == 0)
leapYearFlag = true; // It's a leap year
else leapYearFlag = false; // Not a leap year
return leapYearFlag;
}
int main (void)
{
void clockKeeper(struct dateAndTime dtAnTm);
bool isLeapYear (struct date d);
int numberOfDays (struct date d);
struct time timeUpdate(struct time now);
struct date dateUpdate (struct date today);
return 0;
}
我得到以下錯誤:
gcc .c -o
.c: In function 'clockKeeper':
.c:28:22: error: incompatible types when assigning to type 'struct time' from type 'int'
testTime[i] = timeUpdate (testTime[i]);
^
.c:31:23: error: incompatible types when assigning to type 'struct time' from type 'int'
testTime[i]= dateUpdate (testTime[i]);
^
.c: At top level:
.c:34:13: error: conflicting types for 'timeUpdate'
struct time timeUpdate (struct time now)
^
.c:28:24: note: previous implicit declaration of 'timeUpdate' was here
testTime[i] = timeUpdate (testTime[i]);
^
.c:49:13: error: conflicting types for 'dateUpdate'
struct date dateUpdate (struct date today)
^
.c:31:25: note: previous implicit declaration of 'dateUpdate' was here
testTime[i]= dateUpdate (testTime[i]);
^
make: *** [] Error 1
我已經更新結構,原料與材料[]數組和註釋掉dateUpdate()調用,因爲我相信是不正確。我仍然看到關於類型不匹配的錯誤:
.c:28:22: error: incompatible types when assigning to type 'struct time' from type 'int'
testTime[i] = timeUpdate (testTime[i]);
^
您沒有'clockUpdate()'''clockKeeper()'可見的原型。建議打開隱式函數聲明的警告。 – EOF
一些提示:1.爲源文件命名不僅僅是'.c',例如'mydatesource.c'。 2.將所有警告和調試信息編譯成有意義的可執行文件名(例如'mydateprog'),例如'gcc -Wall -g mydatesource.c -o mydateprog'。 3.改進源代碼,直到你沒有任何警告。 4.學習使用'gdb'調試器&[valgrind](http://valgrind.org/)。花幾天時間閱讀一本好的C編程書籍,以及一些很好的[C參考](http://en.cppreference.com/w/c)。 –