2011-12-20 2 views
1

Я пытаюсь изучить некоторые C и решил использовать книгу «SAMS Научите себя C через 21 день». ( Кстати, есть ли какая-нибудь хорошая книга на C? Это мой третий! У меня всегда заканчивается плохой или сломанный код, который должен работать и ударить по стене в моем процессе обучения, когда он этого не делает! :-() . к сожалению, я бежал на код под что я просто должен напечатать и запустить типирование шло хорошо, но работает ... ну, не так хорошо компилятор дает мне ошибку об этой линии:Error_handler ... что?

{ 
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» не объявлен и что он, похоже, не является библиотечной функцией. ВЗДОХ!


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

Или я должен просто бросить книгу в кучу бесполезных книг о 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; } 

} 
+3

"int argv" и "char * argc []" ... действительно? !!! –

+0

Это то, что говорит книга! : -S –

+0

Но, тем не менее, остальная часть кода в порядке, за исключением этой строки: { printf («Принтер занят или отключен \ n"); error_handler; } –

ответ

0

Попробуйте эту книгу:

Язык программирования C (второе издание) Брайан У. Керниган, Деннис М. Ритчи.

У вас есть argv и argc.

if (argv 1) 

Должно быть:

if (argc == 1) 

Вы можете просто удалить error_handler кусок, как это, кажется, не служат никакой цели и не объявлен в коде. Что, вероятно, пыталась рассказать вам, было, возможно, fprintf для stderror?

+0

argc & argv - это просто имена параметров, их тонкие до тех пор, пока их 'int main (int, char **)'. 'if (argv == 1)' должен делать только штраф в этом случае –

+2

Да, вполне законно объявлять 'int main (int argv, char * argc [])'. Но, читая, у меня глаза истекают кровью. –

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's «Язык программирования C» и выполните все упражнения в нем - вы будете поражены тем, насколько быстро вы переходите от знания ничего к тому, чтобы быть готовым к работе над реальными программами.

+0

Привет, ребята Постарайтесь с другими делами вчера, но я НЕВНО ОТНОСИТЕЛЬНО вернуться к вам! Счастливого Рождества всем вам! –

Смежные вопросы