2016-07-14 66 views
-2

我無法弄清楚爲什麼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]); 
        ^
+2

您沒有'clockUpdate()'''clockKeeper()'可見的原型。建議打開隱式函數聲明的警告。 – EOF

+0

一些提示: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)。 –

回答

1

在clockKeeper幾個問題:

  1. 一個初始化struct time testTime[]正確的做法是這樣的:

    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} 
    }; 
    
  2. 通話dateUpdate(timeTime[i])類型不匹配。你的邏輯在這裏不正確。

+0

明白了。但我仍然看到有關嘗試將int分配給sturct類型的錯誤。 – maverick

+0

@ Bonan-我試過你創建的結構。同樣的結果。 – maverick

+0

移動時間更新在clockKeeper上面 – Bonan

1
struct time testTime [] = { 11, 59, 59, 12, 00, 00, 1, 29, 59, 23, 59, 59, 19, 12, 27 }; 

是不正確,因爲RHS是int秒的陣列。您可以使用:

// Using multiple lines makes the code readable 
struct time testTime [] = { {11, 59, 59}, 
          {12, 00, 00}, 
          {1, 29, 59}, 
          {23, 59, 59}, 
          {19, 12, 27} }; 
+0

我注意到,爲了讓我的原始實現工作,我將不得不(類型轉換)。無論如何,RS指出的原始方法更加清晰。 – maverick

+0

@maverick,我不知道你爲什麼需要投。我的回答中的代碼似乎沒有問題。請參閱http://ideone.com/45Z5nq。 –