【问题标题】:Strange errors using timeval struct and gettimeofday —because of semicolon in #define使用 timeval 结构和 gettimeofday 的奇怪错误——因为 #define 中的分号
【发布时间】:2012-04-27 23:38:18
【问题描述】:

我遇到了一些奇怪的编译错误。这是一个家庭作业(帮助是好的)。这个想法是实现一个程序来测试用户每秒点击“enter”一次的能力。我应该使用 gettimeofday 来获取每个“输入”的一些时间值,然后找出平均时间和标准偏差......我试图通过检查标准输入的 '\n' 来做到这一点,然后如果是的,使用 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

我不明白为什么会出现前两个语法错误,然后我不明白为什么在“main”开头明确声明“entry_array”时未声明它。有什么建议吗?

我觉得我因为不知道如何使用 timeval 结构而被烧毁...最初我尝试像使用任何其他结构一样全局定义 struct 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;
}

【问题讨论】:

    标签: c gettimeofday timeval


    【解决方案1】:

    问题在于MAX_STROKES 宏。因为这是家庭作业,所以我不会告诉你到底是什么问题。

    【讨论】:

    • +1 用于指点而不是回答,因为这是家庭作业。如果可以的话,我会加 5。
    【解决方案2】:
    1. 这个: 无论您在哪里使用“MAX_STROKES”,#define MAX_STROKES 1; 都可能成为语法错误(找出“为什么”是您的工作;))。

    2. 希望您已将其注释掉:GNU nano 2.2.6 File: homework1.c

    3. 我不确定您的“printf()”是否正常:在您的剪切/粘贴中,它在此处被切断:Ready when yo$

    4. 我希望您#包括所有您需要的文件,例如“stdio.h”和“time.h”

    【讨论】:

    • 是的,已注释掉。该死的你们坚持! ;) 感谢您指出错误可能来自何处。我会尽快回来查看。
    【解决方案3】:

    做了一些研究,发现我的 MAX_STROKES 宏想法不太正确。多谢你们。我的猜测是它不代表我想要的。我正在寻找“int MAX_STROKES = 1”... 1 默认情况下是一个字符吗?我不太清楚它到底是什么。阅读后我决定使用“static const int MAX_STROKES = 1;”相反,它编译得很好。

    【讨论】:

    • 问题出在宏中的分号 (";")。你应该把它放在外面。它导致编译器看到:struct timeval entry_array[MAX_STROKES 1;];
    • 该死,你是对的!当我正在查看 K&R 的 C 编程的宏部分时,我完全错过了那个细节……微妙。非常感谢您澄清这一点。这带来的一个问题是......编译器如何知道“1”是一个int?默认?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多