Странные ошибки при использовании структуры timeval и gettimeofday — из-за точки с запятой в #define

Я получаю пару странных ошибок компиляции. Это для домашнего задания (помощь в порядке). Идея состоит в том, чтобы реализовать программу, которая проверяет, насколько хорошо пользователь может нажать «ввод» раз в секунду. Я должен использовать gettimeofday, чтобы получить некоторые значения времени для каждого «входа», а затем узнать, что такое среднее время и стандартное отклонение... Я пытаюсь сделать это, проверив стандартный ввод для «\ n», а затем, если true, используя gettimeofday для заполнения структуры timeval, а затем сохраняя указанную структуру в массиве для последующего использования...

Ошибки, которые я получаю при компиляции (gcc -Wextra homework1.c):

homework1.c: In function ‘main’:
homework1.c:19:29: error: expected ‘]’ before ‘;’ token
homework1.c:27:17: error: expected ‘)’ before ‘;’ token
homework1.c:32:4: error: ‘entry_array’ undeclared (first use in this function)
homework1.c:32:4: note: each undeclared identifier is reported only once for each function it appears in

Я не понимаю, почему я получаю эти первые две синтаксические ошибки, а затем я не могу понять, почему «entry_array» не объявлен, когда я явно объявляю его в начале «main». Предложения?

Я чувствую, что обжигаюсь, не зная, как использовать структуру timeval... Сначала я пытался определить структуру timeval глобально, как и любую другую структуру, но получал ошибку о перезаписи определения для структуры timeval. Это потому, что он определен в библиотеке "sys/time.h"?

Вот код:

  GNU nano 2.2.6                        File: homework1.c                                                       
//prototypes 
int GetAverage(long array[]);
int GetStdDev(long array[]);

//# of keystrokes tracked by user
#define MAX_STROKES 1;



int main(int argv, char ** argc) {
        struct timeval entry_array[MAX_STROKES]; //container for tv_usec fields from timeval struct
        double average = 0; 
        double std_deviation = 0;
        int count = 0; 

        printf("This program will test your ability to hit enter every 1 second, for 10 seconds.  Ready when yo$

        //loop to build array of timeval's
        while (count < MAX_STROKES) {
                struct timeval time_val;
                int input = getc(stdin);
                if (input == '\n') {
                        gettimeofday(&time_val, NULL);
                        entry_array[count] = time_val;
                        ++count;
                }
        }
        return 0;
}

person MCP    schedule 16.04.2012    source источник


Ответы (3)


Проблема в макросе MAX_STROKES. Поскольку это домашнее задание, я не скажу вам, в чем именно заключается проблема.

person hmjd    schedule 16.04.2012
comment
+1 за указание и отсутствие ответа, так как это домашнее задание. Я бы плюс 5, если бы мог. - person pstrjds; 16.04.2012

  1. Это: #define MAX_STROKES 1; может стать синтаксической ошибкой везде, где вы используете "MAX_STROKES" (ваша работа - выяснить "почему" ;)).

  2. Надеюсь, вы закомментировали это: GNU nano 2.2.6 File: homework1.c

  3. Я не уверен, что ваш "printf()" в порядке: в вашем вырезании/вставке он обрезан здесь: Ready when yo$

  4. Я надеюсь, что вы включаете все нужные вам файлы, такие как "stdio.h" и "time.h"

person paulsm4    schedule 16.04.2012
comment
Да, это закомментировано. Будь вы прокляты, ребята, за то, что выдержали! ;) Спасибо, что указали, откуда может исходить ошибка. Я скоро вернусь. - person MCP; 16.04.2012

Провел небольшое исследование и решил, что идея макроса MAX_STROKES, которая у меня была, не совсем верна. Спасибо, парни. Я предполагаю, что это не означало того, что я хотел. Я искал "int MAX_STROKES = 1"... Был ли 1 символом по умолчанию, как это было? Я не могу точно сказать, что именно это было. После прочтения решил использовать "static const int MAX_STROKES = 1;" вместо этого, и он скомпилирован нормально.

person MCP    schedule 16.04.2012
comment
проблема заключалась в точке с запятой (;) в макросе. Вы должны оставить это вне. Это заставило компилятор увидеть это: struct timeval entry_array[MAX_STROKES 1;]; - person paulsm4; 16.04.2012
comment
Дарн, ты прав! Я полностью упустил эту деталь, когда просматривал раздел, посвященный макросам, в K&R's C Programming... Subtle. ОГРОМНОЕ СПАСИБО за разъяснение этого. Возникает один вопрос: как компилятор узнает, что 1 является целым числом? Дефолт? - person MCP; 16.04.2012