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