2012-01-23 10 views
2

私はCでCollat​​zの問題を実装しようとしており、whileループの実行に要する時間を記録/表示します。私は "ダニ"の数と時間を秒単位で報告するはずです。しかし、私のコードから一見単純なエラーが出ていますが、何らかの理由でそれらを修正する方法がわかりません。クロック()を使用してタイムスタンプを取得する(Visual Studio 2010、C/C++)

これは、これらは、Visual Studioが 'clock_t'

8行目と9エラー

を報告しているエラーです

#include <stdio.h> 
#include <time.h> 

void main() { 
    int n, c = 0; 
    printf("Please enter an integer...\n"); 
    scanf("%d", &n); 
    clock_t start; /* Line 8 */ 
    clock_t finish; /* Line 9 */ 

    start = clock(); 
    while (n != 1) { 
     if (n%2 == 0) 
      n = n/2; 
     else 
      n = (3*n)+1; 
     c++; 
     printf("n=%d\n", n); 
    } 
    finish = clock() - start; 
    double interval = finish/(double)CLOCKS_PER_SEC; 

     printf("%d iterations\n", c); 
    printf("%f clock cycles", finish); 
    printf("%f seconds elapsed", interval); 
} 

私のコードです:表現として、この種の不正使用を

構文エラー: ';'がありません。識別子の前に「スタート」

「スタート」:私も「スタート」または「完了」したすべての行は「宣言されていない識別子」エラーを取得しています宣言されていない識別子

答えて

2

を表示すると、移動してみてください任意のステートメントの先頭に変数...

void main() { 
    int n, c = 0; 
    clock_t start; /* Line 8 */ 
    clock_t finish; /* Line 9 */ 
    printf("Please enter an integer...\n"); 
    scanf("%d", &n); 

残りのエラーは、これらが正しく宣言されていない場合の結果です。

以降のC標準(C99)では、宣言をどこでも混在させることができます。多くの場合、それが準拠させるためだけに簡単です...別のアプローチは、とても似{}ブロックを導入することである。この場合、

void main() { 
    int n, c = 0; 
    printf("Please enter an integer...\n"); 
    scanf("%d", &n); 
    { 
     clock_t start; /* Line 8 */ 
     clock_t finish; /* Line 9 */ 

     start = clock(); 
     while (n != 1) { 
      if (n%2 == 0) 
       n = n/2; 
      else 
       n = (3*n)+1; 
      c++; 
      printf("n=%d\n", n); 
     } 
     finish = clock() - start; 
     double interval = finish/(double)CLOCKS_PER_SEC; 

     printf("%d iterations\n", c); 
     printf("%f clock cycles", finish); 
     printf("%f seconds elapsed", interval); 
    } 
} 

それはあなたのコードを再配置するのに十分なシンプルだとして、それは理想的なソリューションではありません。しかし時々これはC89コードをC89でコンパイルしようとすると便利です。

+0

ありがとうございました! – Vance

3

Microsoft Visual C++はC99をサポートしていませんが、各ブロックの先頭に変数を定義する必要がある旧式のC標準をサポートしています。

void main() { 
    int n, c = 0; 
    clock_t start; 
    clock_t finish; 
    printf("Please enter an integer...\n"); 
    scanf("%d", &n); 
+0

クイックレスポンスありがとう – Vance

2

あなたは、Microsoftのコンパイラ(Visual Studioにバンドルさ1)を使用して、Cとしてコードをコンパイルしている場合、あなたはそれが実際にC99 standardをサポートしていないことに注意する必要があります。だから、にあなたのコードを変更します。あなたはC89で立ち往生しています。

そして、C89に欠けている最も厄介なことの1つは、変数をどこにでも宣言できることです。代わりに、あなたはブロックの上にそれらを宣言することを余儀なくされます。

このルールに従わなかったときに発生するコンパイラのエラーは、しばしば不利になります。私はこの間違いをかなり頻繁に行い、出力に数秒間困惑します。

だから、機能ブロックのトップstartfinishを宣言し、このように見えるようにコードを変更します。

#include <stdio.h> 
#include <time.h> 

int main(void) { 
    /* declare all variables at the top */ 
    int n, c = 0; 
    clock_t start; 
    clock_t finish; 

    printf("Please enter an integer...\n"); 
    scanf("%d", &n); 

    start = clock(); 
    while (n != 1) { 
     if (n%2 == 0) 
      n = n/2; 
     else 
      n = (3*n)+1; 
     c++; 
     printf("n=%d\n", n); 
    } 
    finish = clock() - start; 
    double interval = finish/(double)CLOCKS_PER_SEC; 

    printf("%f clock cycles", finish); 
    printf("%f seconds elapsed", interval); 
} 

はまた、Cのvoid main()のようなものが存在しないことに注意してくださいmain関数の関数プロトタイプは、常に以下のいずれかです。

int main(void); 
int main(int argc, char **argv); 
int main(int argc, char *argv[]); 
+0

うわー、Visual Studio(私はJavaから来ています)については決して知らなかった。助けてくれてありがとう。 – Vance

関連する問題