2016-07-07 1 views
-1

J'essaie de créer une entrée simple pour simuler les valeurs de l'horloge temps réel. Tout ce que je veux que le code fasse est de calculer la différence de temps entre les deux structures tm (Time1Start et Time1End). Le month, day, year, etc n'a pas d'importance car ces calculs sont supposés être effectués le même jour.
Je pense qu'il est juste de supposer que les heures et les minutes tombent le premier jour de 1900 puisqu'il n'a pas été initialisé.tm struct et compilateur MPLABX x8

Je reçois un avertissement et quelques erreurs dès que j'essaie de manipuler soit struct. Le code est le suivant:

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

Les erreurs que je reçois sont:

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) 

Je suis en cours d'exécution à l'aide de la MPLAB X IDE v3.30X8 compiler.
Veuillez nous aider

+0

en supposant que cela soit dans 'build.h', (voir [mcve]) pourquoi instanciez-vous des variables en dehors d'une fonction? Notez que l'appel de fonctions en dehors d'une fonction n'est pas autorisé. – KevinDTimm

+0

Le code affiché dans une portée de fonction? – LPs

+0

Veuillez fournir un [mcve]. L'extrait illustré ne compile pas. – Olaf

Répondre

0

Vous ne pouvez pas avoir d'instructions générales en dehors des fonctions, vous devez configurer les membres de structure dans votre fonction main, ou d'autres fonctions d'initialisation.

Ainsi, le code devrait plutôt ressembler à ceci:

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

Sur une note connexe, à moins que les variables sont utilisées par des fonctions différentes et ne peuvent pas être passés comme arguments à ces fonctions, alors ne pas utiliser variables globales, définissez les variables en tant que variables locales dans la fonction main à la place. Ou s'ils ne sont utilisés que dans une autre fonction, déclarez-les comme des variables locales dans cette fonction qui les utilise.

Notez que ce doit être dans un fichier source . Si vous voulez ou avez besoin que les variables soient réellement globales, alors vous devez mettre les déclarations dans un fichier d'en-tête que vous incluez dans les fichiers source qui ont besoin des variables. Ce fichier d'en-tête pourrait ressembler à

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

Le mot-clé est extern ce qui fait une déclaration ces des variables, au lieu d'une définition . Il dit essentiellement au compilateur "cette variable est définie quelque part, c'est bon de l'utiliser".


En ce qui concerne le message d'erreur, les anciennes normes des variables autorisées langage C à définir sans type explicite, puis ils ont été implicitement déclarés comme int, donc au lieu de par exemple

int some_variable = 5; 

Il fut un temps suffisant pour avoir

some_variable = 5; 

Maintenant, le premier message d'avertissement vous indique que vous manquez le type, et cette déclaration int implicite est fait. Ensuite, vous obtenez une erreur car la variable a déjà été déclarée en utilisant un type différent.

+0

Pas le downvoter mais je pense que vous pourriez avoir tort. Cependant, l'appel de fonctions en dehors des fonctions échouera presque certainement. – KevinDTimm

+0

@KevinDTimm Dans la portée globale, en dehors de toutes les fonctions, vous pouvez seulement déclarer des choses, définir des choses, et c'est tout. Vous ne pouvez pas avoir d'instructions comme des affectations ou d'autres expressions. –

+0

Merci; après avoir relu votre réponse, j'ai vu où mon premier commentaire était invalide. THX. – KevinDTimm