Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности

Гостевая книга

От автора

Переопределение встроенных процедур и функций

              Хотя Турбо Паскаль  не  допускает  переопределения  ключевых
         слов, которые входят в язык, он позволяет вам переопределять сло-
         ва,  которые отсылают к стандартным процедурам и функциям.  Прог-
         раммисты иногда думают, что это интересно по многим причинам; од-
         нако,  это может привести только к  неприятностям.  Далее  дается
         пример проблемы, вызванной переопределением встроенной процедуры:
              program WRONG; {данная программа не вернa}
              var
                t: integer;
                units_processed: integer;

              procedure WriteLn(t: integer);
              begin
                write(t, ' ', 'байт свободной памяти в неупорядоченном
                             массиве');
              end;

              begin
                {вычислить объем свободной памяти в неупорядоченном
                                  массиве}
                WriteLn(NemAvail);
                .
                .
                .
                WriteLn(units_processed);
              end.


              Как показано в данном  примере,  программист  переопределяет
         стандартную процедуру WriteLn,  но забыв, что программа также ис-
         пользовала данную процедуру для печати числа обработанных элемен-
         тов. Вместо этого сообщение о свободной памяти будет отображаться
         дважды, так как переопределение WriteLn заменено встроенным опре-
         делением.
              Хотя в предыдущем примере заметить ошибку легко, самые глав-
         ные проблемы возникают тогда, когда встроенные функции и процеду-
         ры переопределены, но не используются непосредственно в программе
         в данном месте.  Позже, когда программа будет модифицирована, пе-
         рераспределенная функция ил процедура рассматривается,  как  если
         бы она была встроенной, как показано в предыдущем примере:

              {проверить окно, оставшееся в глобальной матрице count }
              function MemAvail: boolean;
              var
                t: integer;
              begin
                MemAvail := FALSE;
                for t := 1 to MAX do if count[t]=0 then MemAvail:=TRUE;
              end;

              Переопределение MemAvail  хорошо,  пока  выполняется  данный
         пример. Проблема возникает, если матрица count превращается позд-
         нее из глобальной переменной в динамическую  переменную,  которая
         выделяется из неупорядоченного массива.  В данном случае, если вы
         пытаетесь использовать MemAvail для просмотра того,  осталось  ли
         достаточно  свободного  пространства,  ваша  программа  выйдет из
         строя.
              Единственный способ  избежать  таких  проблем  заключается в
         том,  чтобы никогда не иметь процедур и функций, написанных вами,
         с именами как у встроенных функций. Если вы не уверены, присоеди-
         ните ваши инициалы в начало имени,  например,  HSMemAvail  вместо
         MemAvail.

(с)Все права защищены

По всем интересующим вопросампрошу писать на электронный адрес

    Rambler's Top100 PROext: Top 1000
    Rambler's Top100 Яндекс цитирования
Hosted by uCoz