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

4 に答える 4

5

これを 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); 
}
于 2009-08-09T12:32:58.623 に答える
0

コードにも誤りがあります。srand は、プログラムの存続期間中に 1 回だけ呼び出す必要があります。rand() の前に毎回 srand を呼び出すと、同じ値が何度も得られる可能性があります。

于 2009-08-09T12:53:39.313 に答える
0
ISO C90 forbids mixed declarations and code
于 2009-08-09T13:05:04.437 に答える
0

うーん、これを再現できないようです。あなたの正確なコードを使用して:

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 を有効にした可能性があるということです...しかし、それはあなたが見ているエラーを引き起こすべきではありません.

編集: Visual C++ CLR アプリケーションを作成し、コードを直接貼り付けても再現できません。問題を診断するには、さらに情報が必要です。

編集 2: 実際には、C++ (/TP) コードではなく C (/TC) としてコンパイルすると、再現できます。既に述べたように、C89 では関数の先頭で変数を定義する必要があるため、コードが失敗します。

于 2009-08-09T12:33:36.830 に答える