Использование clock () для отметки времени (Visual Studio 2010, C / C ++) - PullRequest
2 голосов
/ 24 января 2012

Хорошо, я пытаюсь реализовать задачу Коллатца в C и записать / распечатать время, необходимое для выполнения цикла while.Я должен сообщить как количество «тиков», так и время в секундах.Тем не менее, я получаю некоторые, казалось бы, простые ошибки из моего кода, но по какой-то причине я не уверен, как их исправить.

Это мой код

#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);
}

Это ошибки VisualStudio сообщает

Ошибки строк 8 и 9

'clock_t': недопустимое использование этого типа в качестве выражения

синтаксическая ошибка: отсутствует ';'перед идентификатором 'start'

'start': необъявленный идентификатор

Я также получаю ошибку 'undeclared identifier' для всех строк, в которых отображаются 'start' или 'finish'

Ответы [ 3 ]

3 голосов
/ 24 января 2012

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);
2 голосов
/ 24 января 2012

Если вы компилируете код как C, используя компилятор Microsoft (тот, который поставляется вместе с Visual Studio), то вы должны знать, что он на самом деле не поддерживает стандарт C99 . Вы застряли с C89.

И одна из самых ярых вещей, которая отсутствует в C89, - это возможность объявлять переменные где угодно. Вместо этого вы вынуждены объявить их в верхней части блока.

Ошибки компиляции, которые вы получаете, когда вы не соблюдаете это правило, часто довольно неописательны. Я делаю эту ошибку довольно часто и провожу несколько секунд, недоумевая на выходе.

Итак, измените ваш код, чтобы он выглядел следующим образом, объявив start и finish в top функционального блока:

#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[]);
2 голосов
/ 24 января 2012

Попробуйте переместить переменные в верх перед любыми утверждениями ...

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);
    }
}

В этом случае это не идеальное решение, так как достаточно просто переставить ваш код. Но иногда это полезно при попытке компиляции кода C99 в C89 без чрезмерной перестановки.

...