Error_handler ......什么?

时间:2011-12-20 17:12:26

标签: c error-handling syntax-error

我正在尝试学习一些C并选择使用“SAMS在21天内自学C”这本书。 ( btw是否有任何好的C书?这是我的第三本书!我总是会遇到错误或破坏的代码,应该可以工作并在我的学习过程中遇到问题而不是!:-( ) 可悲的是,我已经运行了下面的代码,我应该输入并运行。打字很顺利但是跑步......好吧,不太好! 编译器给出了关于这一行的错误:

{
printf ("Printer busy or disconnected\n"); error_handler; }

当我尝试运行此代码时。而且因为我在C编码方面非常新手,所以当编辑器返回如下错误消息时,我根本没有任何想法:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
rm -f -r build/Debug
rm -f dist/Debug/GNU-MacOSX/type_and_run

CLEAN SUCCESSFUL (total time: 158ms)
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/type_and_run
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/Type and run 1.o.d
gcc    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/Type and run 1.o.d -o build/Debug
/GNU-MacOSX/Type\ and\ run\ 1.o Type\ and\ run\ 1.c
i686-apple-darwin10-gcc-4.2.1: and: No such file or directory
i686-apple-darwin10-gcc-4.2.1: run: No such file or directory
i686-apple-darwin10-gcc-4.2.1: 1.o.d: No such file or directory
Type and run 1.c: In function 'do_heading':
Type and run 1.c:54: error: 'error_handler' undeclared (first use in this function)
Type and run 1.c:54: error: (Each undeclared identifier is reported only once
Type and run 1.c:54: error: for each function it appears in.)
make[2]: *** [build/Debug/GNU-MacOSX/Type and run 1.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 158ms)

我只能理解“error_handler”是未声明的,它似乎不是库函数。 SIGH!


所以说简短,有什么我可以做的修改代码,以便它可以按预期工作,我可以继续前进?

或者我应该把这本书放在一堆关于C的无用书中?

下面是代码的全长:

void do_heading(char *filename);

int line = 0, page = 0;

int main(int argv, char *argc[])

{
    char buffer[256];
    FILE *fp;

    if (argv < 2) 
    {
        fprintf(stderr, "\nProper Usage is: " );
        fprintf(stderr, "\n\nprint_it filename.ext\n");
        return (1);
    }

    if ((fp = fopen(argc[1], "r")) == NULL) 
    {
        fprintf(stderr, "Error opening file, %s!", argc[1]);
        return (1);
    }

    page = 0;
    line = 1;
    do_heading(argc[1]);

    while( fgets( buffer, 256, fp ) != NULL ) 
    {
        if( line % 55 == 0 )
            do_heading(argc[1]);

        fprintf( stdout , "%4d:\t%s", line++, buffer );
    }

    fprintf( stdout , "\f" );
    fclose(fp);
    return 0;
}

void do_heading(char *filename) 
{
    page++;

    if (page > 1)
        fprintf( stdout , "\f");

    fprintf( stdout, "Page: %d, %s\n\n", page, filename);

    if ((stdout = fopen("PRT:","w")) == NULL) {
    printf ("Printer busy or disconnected\n"); error_handler; }

}

2 个答案:

答案 0 :(得分:0)

试试这本书:

C编程语言(第2版),作者:Brian W. Kernighan,Dennis M. Ritchie。

你有argv和argc交换。

if (argv 1)

应该是:

if (argc == 1)

您可以简单地删除error_handler块,因为它似乎没有用处,并且未在代码中声明。这本书可能试图告诉你的可能是fprintf到stderror?

答案 1 :(得分:0)

因此编译器输出可能看起来令人生畏,但是,作为一个初学者,你关心的位通常是英文的。这个例子也不例外:

Type and run 1.c: In function 'do_heading':
Type and run 1.c:54: error: 'error_handler' undeclared (first use in this function)
Type and run 1.c:54: error: (Each undeclared identifier is reported only once
Type and run 1.c:54: error: for each function it appears in.)

它告诉你error_handler未声明。它在你的程序中没有其他地方出现,所以你无法在这里使用它。让我们来看看这一行:

if ((stdout = fopen("PRT:","w")) == NULL) {
    printf ("Printer busy or disconnected\n"); error_handler; }

你应该知道分号是表示语句结束的一种方式,而良好的做法是在一行上只放一个语句。分手:

if ((stdout = fopen("PRT:","w")) == NULL) {
    printf ("Printer busy or disconnected\n"); 
    error_handler; 
}

现在很明显:你只是说error_handler;;它没有做任何事情,它不是函数调用(没有括号),不是你分配或读取的变量所以它显然是一个巨大的重量错误。删除它然后重试。

顺便说一句,如果书中出现的行与你把它放在一边 - 在一行上有两个分号 - 那么是的,你应该将它扔在火上。阅读Kernighan和Ritchie的“The C Programming Language”并完成其中的所有练习 - 你会惊讶于你从无所知到准备好在真正的程序上工作的速度。