#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static struct tm createDate(unsigned day, unsigned mon, int year) {
struct tm b = {0,0,0,day,mon-1,year-1900}; return b;
}
static int dateExceeded(unsigned day, unsigned mon, int year) {
struct tm b = createDate(day,mon,year);
time_t y = mktime(&b), now;
time(&now); // error C2143: syntax error : missing ';' before 'type'
double diff = difftime(y, now)/(60 * 60 * 24); // error C2065: 'diff' : undeclared identifier
return (diff < 0);
}
static void randomEvent(){
srand(time(NULL));
if (rand()%10) {
printf("Do something here\n"); // C2143: syntax error : missing ';' before 'type'
}
}
Répondre
Si vous compilez ceci comme code C89, vous devez déclarer les variables au début des blocs. Vous ne pouvez pas déclarer double diff
au milieu du bloc:
static int dateExceeded(unsigned day, unsigned mon, int year) {
double diff;
struct tm b = createDate(day,mon,year);
time_t y = mktime(&b), now;
time(&now);
diff = difftime(y, now)/(60 * 60 * 24);
return (diff < 0);
}
Hmm, je ne semble pas être en mesure de reproduire cela. En utilisant votre code exact:
1>------ Build started: Project: so_1251288, Configuration: Debug Win32 ------
1>Compiling...
1>so_1251288.cpp
1>c:\users\matthew iselin\documents\visual studio 2008\projects\so_1251288\so_1251288\so_1251288.cpp(21) : warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
1>Linking...
1>Build log was saved at *snip*
1>so_1251288 - 0 error(s), 1 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
J'ai supposé que vous utilisez Visual C++. Quelle version utilisez-vous? Quel est votre environnement configuré en tant que? La seule chose à laquelle je peux penser est que vous avez involontairement activé Unicode plutôt que le codage de caractères multi-octets ... Mais cela ne devrait pas causer les erreurs que vous voyez.
EDIT: Je ne peux même pas reproduire en créant une application Visual C++ CLR et en collant directement votre code. Nous avons besoin de plus d'informations pour pouvoir diagnostiquer le problème.
EDIT 2: En fait, je peux reproduire, quand je compile comme C (/ TC) plutôt que le code C++ (/ TP). Comme cela a déjà été mentionné, C89 exige que les variables soient définies au début des fonctions, ce qui entraîne l'échec de votre code.
Compilez-le en tant que code C (pas C++) et vous verrez. –
Oui, j'ai testé ça juste après avoir lu votre réponse :) –
Il y a aussi une erreur dans le code. Vous devriez appeler srand une seule fois dans la vie du programme. Si vous appelez srand à chaque fois avant rand(), il peut arriver que vous obteniez les mêmes valeurs encore et encore.
ISO C90 forbids mixed declarations and code
Visual C++, je comprends? –
est un type non signé? – Zed
@Matthew: Très probablement, d'autant plus qu'il se compile parfaitement sous GCC. – hbw