Энциклопедия Turbo Pascal. Главы 9-11
Страница 35. Переопределение встроенных процедур и функций


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

     Хотя Турбо Паскаль  не  допускает  переопределения  ключевых
слов, которые входят в язык, он позволяет вам переопределять сло-
ва,  которые отсылают к стандартным процедурам и функциям.  Прог-
раммисты иногда думают, что это интересно по многим причинам; од-
нако,  это может привести только к  неприятностям.  Далее  дается
пример проблемы, вызванной переопределением встроенной процедуры:
     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.

 
Следующая статья »