Турбо С: руководство пользователя. Часть 1

Турбо С: руководство пользователя. Часть 1 - Стр. 17

Печать PDF
Индекс материала
Турбо С: руководство пользователя. Часть 1
Стр. 2
Стр. 3
Стр. 4
Стр. 5
Стр. 6
Стр. 7
Стр. 8
Стр. 9
Стр. 10
Стр. 11
Стр. 12
Стр. 13
Стр. 14
Стр. 15
Стр. 16
Стр. 17
Стр. 18
Стр. 19
Стр. 20
Стр. 21
Стр. 22
Стр. 23
Стр. 24
Стр. 25
Стр. 26
Стр. 27
Стр. 28
Стр. 29
Стр. 30
Стр. 31
Стр. 32
Стр. 33
Стр. 34
Стр. 35
Стр. 36
Стр. 37
Стр. 38
Стр. 39
Стр. 40
Стр. 41
Стр. 42
Стр. 43
Стр. 44
Стр. 45
Стр. 46
Стр. 47
Стр. 48
Стр. 49
Стр. 50
Стр. 51
Стр. 52
Стр. 53
Стр. 54
Стр. 55
Стр. 56
Стр. 57
Стр. 58
Стр. 59
Стр. 60
Стр. 61
Стр. 62
Стр. 63
Стр. 64
Стр. 65
Стр. 66
Стр. 67
Стр. 68
Стр. 69
Все страницы
                                                                                
     void main(void)                                                            
     {                                                                          
          FILE        *infile;         /* Input file. */                        
          char        linebfr[1024],   /* Input line buffer, very               
                                          long for safety */                    
                      *wordptr;        /* Pointer to next word in               
                                          linebfr */                            
          int            i;            /* Scratch variable. */                  
          static int  wordlencnt[MAXWORDLEN],                                   
                                                                                
                           /* Word lengths are counted in elements 1            
                              to MAXWORDLEN. Element 0 isn't used.              

                         - 135,136 -
                                                                                
                              The array is static so that the elements          
                              need not be set to zero at run time. */           
                                                                                
                      overlencnt; /* Overlength words are counted               
                                     here. */                                   
                                                                                
     printf("Эта программа предлагается в качестве примера для\n");             
     printf("проведения практического занятия по отладке\n");                   
     printf("Если вы не хотите ее выполнить под управлением\n");                
     printf("интегрированной среды, нажмите Ctrl-Break.\n");                    
     printf("Смотрите главу Отладка программ Руководства");                     
     printf("пользователя для уточнения деталей.\n\n");                         
                                                                                
          printf("Введите имя файла: ");                                        
          gets(linebfr);                                                        
          if ( !strlen(linebfr) ) {                                             
               printf("Вы должны указать имя файла !\n");                       
               exit();                                                          
          }                                                                     
                                                                                
          infile = fopen( linebfr,"r" );                                        
          if ( !infile ) {                                                      
                                                                                
               printf("Файл нельзя открыть !\n");                               
               exit();                                                          
          }                                                                     
                                                                                
          /* Each loop processes one line. NOTE: If a line is longer            
          than the  input  buffer,  the  program  may  produce invalid          
          results. The very large buffer makes this unlikely. */                
                                                                                
          while (  fgets( linebfr, sizeof(linebfr), infile ) ) {                
               printf("%s\n",linebfr);                                          
          /* Check for buffer overflow & remove the  trailing newline.          
          */                                                                    
               i=strlen(linebfr);                                               
               if ( linebfr[i-1] != '\n' ) {                                    
                printf("Длина строки превышает максимальную");                  
                printf("\n\t%70s\n",linebfr); }                                 
               else                                                             
                linebfr[i-1] = NULL;                                            
                                                                                
           /* lineptr points to the 1st word in linebfr (past leading           
              spaces). */                                                       
                wordptr = nextword(linebfr);                                    

                         - 137,138 -
                                                                                
                                                                                
           /* Each loop processes one word. The loop ends when                  
              [nextword] returns NULL, indicating there are more                
              words. */                                                         
               while (*wordptr) {                                               
               /* Find the length of this word, increment the proper            
                  element of the length count array, and point to the           
                  space following the word .*/                                  
                    i=wordlen(wordptr);                                         
                    if ( i > MAXWORDLEN )                                       
                         overlencnt++;                                          
                    else                                                        
                         ;                                                      
                         wordlencnt[i]++;                                       
                    wordptr += i;                                               
                /* Find the next word (if any). */                              
                    wordptr = nextword(wordptr);                                
               }                                                                
          }                                                                     
                                                                                
          /* Print the word length counts. Each loop prints one. */             
          printf("Длина  Количество\n");                                        
                                                                                
          for ( i=1, i=MAXWORDLEN, i++)                                         
               printf(" %5d %5d\n", i, wordlencnt[i] );                         
          printf("Остальные %5d\n", overlencnt );                               
                                                                                
          /* Close the file and quit. */                                        
          fclose(infile);                                                       
     }                                                                          
                                                                                
          Убедитесь в  том,  что  опции   Debug/Source   Debugging   и          
     O/C/C/OBJ Debug Information были включены (On).  В ответ на приг-          

     лашение DOS запустите Турбо Си с помощью следующей команды                 
                                                                                
          TC WORDCNT                                                            
                                                                                
     в ответ  на   приглашение   DOS.   Создайте   программу   (выбрав          
     Compiler/Build  All).  Турбо  Си выполнит компиляцию и компоновку          
     программы WORDCNT,  тем самым подготовив ее для выполнения, а за-          
     тем остановится. Теперь выберите элемент меню Run/Trace Into (или          
     нажмите F7).                                                               
                                                                                
          В этот момент отладчик разместит в окне  редактирования вашу          
     программу так,  чтобы было видно начало функции main. Строка, со-          

                         - 139,140 -
                                                                                
                                                                                
     держащая объявление функции main (void main(void)), будет выделе-          
     на  (цветом),  свидетельствуя о том,  что при запуске WORDCNT она          
     будет выполнена первой.  Эта выделенная строка называется "марке-          
     ром выполнения",  фиксирующим текущую позицию программы:  строку,          
     содержащую оператор, который будет выполнен следующим.                     
                                                                                
          Для того, чтобы выполнить WORDCNT, выберите Run/Run. WORDCNT          
     предложит  вам ввести имя входного файла.  Наберите WORDCNT.DAT и          
     нажмите Ввод.  WORDCNT считает и выведет первую строку файла дан-          
     ных,  а  затем  ваш компьютер "зависнет",  т.к.  в программе есть          
     ошибки.  Нажав Ctrl-Break и затем Esc, вы разблокируете компьютер          
     и сможете продолжить работу.  Для завершения сеанса отладки необ-          
     ходимо выбрать Run/Program Reset (или  нажать  "горячую"  клавишу          
     Ctrl-F2),  а  для возобновления отладки - Run/Trace Into (или на-          
     жать F7).                                                                  
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
               Установка и использование точки останова                         
     -----------------------------------------------------------------          
                                                                                
          Первая часть функции main,  согласно комментариям в исходном          
     тексте программы,  выдает приглашение для  ввода  имени  входного          
     файла  и открывает этот файл.  Тот факт,  что WORDCNT считывает и          
     выводит первую строку входного файла свидетельствует о правильной          
     работе этой части программы,  по крайней мере, она не причастна к          
     наблюдаемой ошибке. Поэтому вы можете выполнить первую часть main          
     и  остановиться,  когда достигнете подозрительных,  с вашей точки          
     зрения,  строк программы.  Для этого,  вы должны установить точку          
     останова в той строке, где хотите остановиться.                            
                                                                                
          Используя клавиши PgDn и "стрелка вниз",  переместите курсор          
     в строку, начинающуюся с                                                   
                                                                                
          while(fgets(...                                                       
                                                                                
     (эта строка находится сразу же за комментарием,  начинающимся  со          
     слов "Each loop proceess...")                                              
                                                                                
          Обратите внимание,  что  маркер выполнения не движется.  Это          

                         - 141,142 -
                                                                                
     происходит из-за того,  что никакие операторы программы не выпол-          
     няются; вы лишь перемещаете курсор редактора.                              
                                                                                
          Для того, чтобы установить точку останова, необходимо помес-          
     тить   курсор   в   нужную   строку   и   выбрать    Break/Watch/          
     TOGLE/Breakpoint   (или   нажать   комбинацию   "горячих"  клавиш          
     Ctrl-F8).  Отладчик выделит указанную строку (цветом),  что будет          
     свидетельствовать об установке в этой строке точки останова.  За-          
     метьте, что строка,  в которой находится точка останова и  маркер          
     выполнения, выделяются по-разному (разными цветами).                       
                                                                                
          Выберите Run/Run  (или  нажмите Ctrl-F9) и WORDCNT продолжит          
     свою работу (в данном случае - с самого начала). После выдачи со-          
     общения о необходимости ввода имени входного файла, WORDCNT оста-          
     новится и будет ожидать ввода с клавиатуры.  Отладчик выводит со-          
     общение  WORDCNT  на  экран  выполнения  (Execution),  на который          
     сообщения WORDCNT выдаются так,  как если бы ее работа  протекала          
     без отладчика.  Наберите WORDCNT.DAT и нажмите Ввод. WORDCNT про-          
     должит выполнение до тех пор,  пока не встретится точка останова;          
     затем  она остановится и на экране вновь появится окно редактиро-          
     вания (Edit).  Курсор и маркер выполнения будут указывать на опе-          
     ратор while.                                                               
                                                                                
                                                                                
                                                                                
          Заметим, что установленная вами на операторе while точка ос-          
     танова не исчезла, вы просто не видите ее, потому что ее заслонил          
     маркер выполнения,  но она вновь появится после того,  как маркер          
     выполнения переместится дальше. Каждый раз, "доходя" до этой точ-          
     ки останова,  WORDCNT будет останавливаться.  И это будет продол-          
     жаться до тех пор, пока вы ее не "выключите".