Может кто-нибудь увидеть, что с этим не так (временные функции в C) - PullRequest
0 голосов
/ 09 августа 2009
#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'
  } 
}

Ответы [ 4 ]

5 голосов
/ 09 августа 2009

Если вы компилируете это как код C89, вы должны объявить переменные в начале блоков. Вы не можете объявить double diff в середине блока:

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); 
}
0 голосов
/ 09 августа 2009
ISO C90 forbids mixed declarations and code
0 голосов
/ 09 августа 2009

В коде также есть ошибка. Вы должны вызывать srand только один раз за время существования программы. Если вы вызываете srand каждый раз перед rand (), может случиться так, что вы будете получать одни и те же значения снова и снова.

0 голосов
/ 09 августа 2009

Хм, я не могу воспроизвести это. Используя ваш точный код:

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

Я предполагал, что вы используете Visual C ++. Какую версию ты используешь? Как настроена ваша среда?

Единственное, о чем я могу думать, это то, что вы можете непреднамеренно включить Unicode вместо многобайтовой кодировки символов ... Но это не должно вызывать ошибки, которые вы видите.

РЕДАКТИРОВАТЬ: я даже не могу воспроизвести, создав CLR-приложение Visual C ++ и непосредственно вставив ваш код. Нам нужна дополнительная информация для диагностики проблемы.

РЕДАКТИРОВАТЬ 2: На самом деле, я могу воспроизвести, когда я компилирую как код C (/ TC), а не C ++ (/ TP). Как уже упоминалось, C89 требует, чтобы переменные были определены в начале функций, что приводит к сбою вашего кода.

...