2016-07-07 21 views
-1

Ich versuche, einen einfachen Eingang zu simulieren, um Echtzeituhr-Werte zu simulieren. Alles, was der Code tun soll, ist die Zeitdifferenz zwischen den beiden tm-Strukturen (Time1Start und Time1End). Die month, day, year, etc sind nicht wichtig, da diese Berechnungen am selben Tag durchgeführt werden.
Ich denke, es ist richtig anzunehmen, dass die Stunden und Minuten auf den ersten Tag des Jahres 1900 fallen, da es nicht initialisiert wurde.tm struct und MPLABX x8 Compiler

Ich bekomme eine Warnung und ein paar Fehler, sobald ich versuche, beide Struktur zu manipulieren. Der Code lautet wie folgt:

#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; 

Die Fehler, die ich empfangen sind:

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) 

Ich arbeite in MPLAB X IDE v3.30 die X8 compiler verwenden.
Bitte helfen Sie

+0

unter der Annahme, dass dies in 'build.h' ist, (siehe [mcve]) Warum instanziieren Sie Variablen außerhalb einer Funktion? Beachten Sie, dass das Aufrufen von Funktionen außerhalb einer Funktion nicht zulässig ist. – KevinDTimm

+0

Ist der gebuchte Code in einem Funktionsumfang? – LPs

+0

Bitte geben Sie eine [mcve] an. Das angezeigte Snippet wird nicht kompiliert. – Olaf

Antwort

0

Sie können keine allgemeinen Anweisungen außerhalb von Funktionen haben, müssen Sie die Strukturelemente in Ihrer main Funktion oder einige andere Initialisierungsfunktionen einrichten.

So sollte der Code stattdessen wie folgt aussehen:

#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; 
} 

Auf einem verwandten beachten, es sei denn, die Variablen durch verschiedene Funktionen verwendet werden und können nicht als Argumente für diese Funktionen übergeben werden, dann nicht verwenden Globale Variablen, definieren Sie stattdessen die Variablen als lokale Variablen innerhalb der main-Funktion. Oder wenn sie nur in einer anderen einzelnen Funktion verwendet werden, deklarieren Sie sie als lokale Variablen innerhalb der Funktion, die sie verwendet.

Beachten Sie, dass das obige in einer Quelldatei sein sollte. Wenn Sie möchten, dass die Variablen tatsächlich global sind, sollten Sie die Deklarationen in eine Header-Datei einfügen, die Sie in die Quelldateien einfügen, die die Variablen benötigen. Das Header-Datei so etwas wie

// 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 

aussehen könnte das extern Schlüsselwort ist, was diese macht eine Erklärung der Variablen anstelle einer Definition. Es sagt dem Compiler im Grunde "diese Variable ist irgendwo definiert, es ist in Ordnung, sie zu benutzen".


Was die Fehlermeldung, ältere Standards der C-Sprache erlaubt Variablen ohne explizite Art definiert werden, und dann wurden sie implizit als int deklariert, so dass anstelle von z.B.

int some_variable = 5; 

es verwendet genug zu sein, Sie zu haben

some_variable = 5; 

Nun ist die erste Warnmeldung zu sagen, dass Sie die Art fehlen, und diese implizite int Deklaration erfolgt. Dann erhalten Sie einen Fehler, weil die Variable bereits mit einem anderen Typ deklariert wurde.

+0

Nicht der Downvoter, aber ich denke du liegst falsch. Das Aufrufen von Funktionen außerhalb von Funktionen wird jedoch höchstwahrscheinlich fehlschlagen. – KevinDTimm

+0

@KevinDTimm Im globalen Bereich, außerhalb von Funktionen, können Sie nur Dinge deklarieren, Dinge definieren, und das wars. Sie können keine Anweisungen wie Zuweisungen oder andere Ausdrücke haben. –

+0

Danke; Nach dem Lesen Ihrer Antwort sah ich, wo mein erster Kommentar ungültig war. Danke. – KevinDTimm