#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 に答える
これを 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);
}
コードにも誤りがあります。srand は、プログラムの存続期間中に 1 回だけ呼び出す必要があります。rand() の前に毎回 srand を呼び出すと、同じ値が何度も得られる可能性があります。
ISO C90 forbids mixed declarations and code
うーん、これを再現できないようです。あなたの正確なコードを使用して:
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 では関数の先頭で変数を定義する必要があるため、コードが失敗します。