2016-07-07 44 views
-1

我正在嘗試創建一個簡單的輸入來模擬實時時鐘值。我希望代碼所做的是計算兩個tm結構之間的時間差(Time1Start和Time1End)。 month, day, year, etc並不重要,因爲這些計算是假定在同一天完成的。
我認爲假設小時和分鐘是在1900年的第一天,因爲它尚未初始化,這是正確的。tm struct和MPLABX x8編譯器

一旦我嘗試操作任何一個結構,我就會收到警告和一些錯誤。代碼如下:

#include <time.h> 

struct tm Time1Start;  
Time1Start.tm_hour = 0; //start of day - errors start here (line 38) 
Time1Start.tm_min = 0; 

struct tm Time1End; 
Time1End.tm_hour = 17; //5:XX o'clock 
Time1End.tm_min = 30; //5:30 

double seconds; 
double minutes; 
seconds = difftime(mktime(Time1Start), mktime(Time1End)); 
minutes = seconds/60; 

我收到的錯誤是:

build.h:38: warning: (374) missing basic type; int assumed 

build.h:38: error: (984) type redeclared 

build.h:38: error: (1098) conflicting declarations for variable "Time1Start" (build.h:37) 

我在MPLAB X IDE v3.30使用X8 compiler運行。
請幫忙

+0

假設這是'build.h',(參見[mcve])爲什麼要在函數外實例化變量?請注意,不允許調用函數外部的函數。 – KevinDTimm

+0

函數作用域內的發佈代碼是什麼? – LPs

+0

請提供[mcve]。顯示的代碼片段不能編譯。 – Olaf

回答

0

你不能在函數之外有一般的語句,你需要在你的main函數或其他一些初始化函數中設置結構成員。

因此,代碼應該不是這個樣子:

#include <time.h> 

struct tm Time1Start;  
struct tm Time1End; 

double seconds; 
double minutes; 

int main(void) 
{ 
    Time1Start.tm_hour = 0; //start of day - errors start here (line 38) 
    Time1Start.tm_min = 0; 

    Time1End.tm_hour = 17; //5:XX o'clock 
    Time1End.tm_min = 30; //5:30 

    seconds = difftime(mktime(Time1Start), mktime(Time1End)); 
    minutes = seconds/60; 

    // Rest of the main function code... 

    return 0; 
} 

與此相關的,除非變量是由不同的功能使用,不能作爲參數傳遞給那些函數,那麼就不要使用全局變量,而是將變量定義爲main函數內的局部變量。或者,如果它們僅用於另一個函數,則將其聲明爲使用它們的函數內的局部變量。

請注意,上述應在源文件。如果你想或者需要這些變量實際上是全局變量,那麼你應該把聲明放在你包含在需要變量的源文件中的頭文件中。該頭文件可能看起來像

// First an include guard (https://en.wikipedia.org/wiki/Include_guard) 
#ifndef BUILD_H 
#define BUILD_H 

#include <time.h> 

extern struct tm Time1Start;  
extern struct tm Time1End; 

extern double seconds; 
extern double minutes; 

#endif // BUILD_H 

extern關鍵字是什麼使這些一聲明的變量,而不是定義。它基本上告訴編譯器「這個變量是在某個地方定義的,可以使用它」。


至於該錯誤消息,較老的標準允許在沒有顯式類型中定義的變量,並且然後將它們隱式聲明爲int C語言的,所以不是例如

int some_variable = 5; 

它曾經是足有

some_variable = 5; 

現在的第一個警告消息告訴你,你缺少的類型,這種隱含int聲明完成。然後你得到一個錯誤,因爲這個變量已經使用不同的類型聲明瞭。

+0

不是downvoter,但我認爲你可能是錯的。但是,在函數之外調用函數幾乎肯定會失敗。 – KevinDTimm

+0

@KevinDTimm在全球範圍內,任何功能外,你只能申報物品,定義的東西,僅此而已。你不能擁有分配或其他表達式之類的語句。 –

+0

謝謝;重讀你的答案後,我看到我的第一條評論無效。謝謝。 – KevinDTimm