2015-12-06 4 views
1

Я прочитал этот пост here и я следовал инструкциям, применяя их к простой программе, суммирует все числа ниже 1000 делится на 3 и 5Как раз, когда программа C

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

clock_t begin, end; 
double time_spent; 

begin = clock(); 
int sumDivisibleBy (div, limit) { 
    int h = (limit - 1)/div; 
    return div*h*(h+1)/2; 
} 

int main(void) { 
    int l = 1000; 
    int s = sumDivisibleBy(3,l) + sumDivisibleBy(5,l) - sumDivisibleBy(15,l); 
    printf("%d \n", s); 
} 
end = clock(); 
time_spent = (double)(end - begin)/CLOCKS_PER_SEC 
printf("%f \n", time_spent) 

Теперь, при вводе в терминале «сделать 1» (файл называется 1.c), это то, что я получаю:

cc  1.c -o 1 
1.c:9:1: warning: data definition has no type or storage class [enabled by default] 
begin = clock(); 
^ 
1.c:9:1: error: conflicting types for ‘begin’ 
1.c:6:9: note: previous declaration of ‘begin’ was here 
clock_t begin, end; 
     ^
1.c:9:1: error: initializer element is not constant 
begin = clock(); 
^ 
1.c:20:1: warning: data definition has no type or storage class [enabled by default] 
end = clock(); 
^ 
1.c:20:1: error: conflicting types for ‘end’ 
1.c:6:16: note: previous declaration of ‘end’ was here 
clock_t begin, end; 
       ^
1.c:20:1: error: initializer element is not constant 
end = clock(); 
^ 
1.c:21:1: warning: data definition has no type or storage class [enabled by default] 
time_spent = (double)(end - begin)/CLOCKS_PER_SEC 
^ 
1.c:21:1: error: conflicting types for ‘time_spent’ 
1.c:7:8: note: previous declaration of ‘time_spent’ was here 
double time_spent; 
     ^
1.c:21:1: error: initializer element is not constant 
time_spent = (double)(end - begin)/CLOCKS_PER_SEC 
^ 
1.c:21:1: error: expected ‘,’ or ‘;’ at end of input 
make: *** [1] Error 1 

Почему это? Может кто-нибудь помочь, пожалуйста?

ответ

3

Вы не можете использовать вызовы функций для инициализации области файла переменных (те, за пределами основной).

Вы должны переместить begin и end в main() (ну, по крайней мере, их инициализация).

Программа C не выполняет сверху вниз; он начинается с main(). Значения инициализированных переменных области файла должны быть известны во время компиляции, поэтому вы не можете использовать вызовы функций.

Чтобы получить значимые результаты, я также предлагаю вам запустить код для тестирования много раз в цикле, так как разрешение часы часто слишком грубое время нескольких инструкций, то есть сделать что-то вроде

begin = ... 
for (j = 0; j < 10000; ++j) { 
    code_to_test(); 
} 
end = ... 
+0

Спасибо @Jens :) проблема решена – Pigna

+0

@Pigna Это хорошие новости. Теперь следующий шаг в переполнении стека - это * принять * ответ, который вы считаете наиболее полезным, щелкнув галочкой * слева. Это принесет вам два репутационных очков. – Jens

+0

Почему ++ j и не j ++? – Pigna

1

Хотя вы можете инициализировать глобальные переменные за пределами кодового блока, вы не можете делать то, что вы делаете (если вы хотите, чтобы код работал). В общем, код не должен сидеть вне функций. Вы хотите, чтобы end = clock() был выполнен в конце! Для этого он должен быть в конце функции main().

Переместить код в основной(), так что читает:

int main(void) { 
    begin = clock(); 

    ... //your code here 

    end = clock(); 
    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
    printf("time spent %f \n", time_spent); 
}