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