Предыдущий раздел

Сводка красных правил

Общее

Не все, что в математической формуле изображается переменной с индексом, в программе следует изображать массивом.

Накопитель

Накопителем обычно называют переменную ("ячейку памяти"), где накапливается результат операции, которую надо произвести над всеми элементами некоторой последовательности однотипных данных (это может быть массив, или упорядоченный список, или записи файла, и т.д.). Эта операция должна быть такова, что ее можно выполнить, перебирая все эти данные последовательно.
Правило. Перед использованием накопителя его надо инициализировать, т.е. придать ему значение, которое он естественно должен иметь до начала обработки данных.

Рекурсия

Правило 1. Необходимо обеспечить завершение процесса рекурсивных вызовов функции (процедуры) на каком-то шаге. Для этого, во-первых, в теле функции должно быть предусмотрено условие, при выполнении которого дальнейшая рекурсия не требуется. Во-вторых, необходимо обеспечить такое изменение данных при повторных функции (процедуры), чтобы это условие рано или поздно наступило.

Правило 2. Глубина рекурсии, т.е. максимальное количество вложенных вызовов функции или процедуры, должна быть не слишком большой.
Правило 3. Необходимо экономно расходовать локальные переменные рекурсивной функции.
Правило 4. Не следует отключать контроль использования стека (опция меню Options/Compiler/Stack checking или директива компилятора {$S+}) во избежание его переполнения. (Переполнение стека может вызвать сбой системы и повлечь за собой перезагрузку системы.)

В то же время

Правило 5. Следует избегать такого программирования, при котором рекурсивная функция (или процедура) вносит изменения в глобальные данные. Если же это правило приходится нарушить, то к таким изменениям требуется уделять повышенное внимание.

Это частный случай более общего

Правила 6. Перед выходом из процедуры или функции следует устранить все изменения в глобальных переменных, настройках системы, состоянии компьютера, и т.д., которые были сделаны этой процедурой или функцией, но не являются целью ее работы.

Параметры (аргументы) процедур и функций

Параметры, переданные по значению (без ключа VAR), можно использовать в процедуре как обычные локальные переменные.
При этом нет необходимости перед завершением работы процедуры восстанавливать значения этих параметров-переменных.
Как правило, ключ VAR не применяется к параметрам процедур типа указатель.
Этот ключ нужен только тогда, когда одной из целей работы процедуры является возвращение НОВОГО ЗНАЧЕНИЯ указателя.
Например, если процедура выделяет участок динамической памяти, размещает в нем информацию и возвращает адрес этой информации для использования в вызывающей процедуре.
Если исходное значение указателя, стоящего в списке параметров, потребуется более одного раза, то лучше не изменять этого параметра, а использовать для работы вместо него вспомогательный, локальный, указатель. И присваивать ему значение параметра каждый раз, когда это значение понадобится.

Указатели и динамическая память

Правило. Перед использованием указателя его надо инициализировать, т.е. придать ему значение адреса той переменной, которую мы хотим обрабатывать.

Нарушение этого правила очень часто допускается новичками при работе с указателями!!!
А последствия могут быть катастрофическими!

Надо тщательно следить за тем, чтобы перемещающийся по массиву указатель всегда указывал на элемент массива, а не мимо него, причем именно на тот элемент, который нужен. Особенно пристально надо проверять первый и последний проходы тела цикла.

Еще раз!

Разработчик процедуры (функции) должен тщательно следить за тем, чтобы номер используемого элемента массива не превосходил передаваемой в качестве параметра реальной размерности массива, а на пользователя процедуры возлагается ответственность за правильность значения этого параметра.

Как правило, ключ VAR не применяется к параметрам процедур типа указатель.
Этот ключ нужен только тогда, когда одной из целей работы процедуры является возвращение НОВОГО ЗНАЧЕНИЯ указателя.
Например, если процедура выделяет участок динамической памяти, размещает в нем информацию и возвращает адрес этой информации для использования в вызывающей процедуре.
Очень важно, что параметры команда FreeMem должны совпадать с параметрами команлы GetMem, причем не по форме записи, а по принимаемым значениям.
Если исходное значение указателя, стоящего в списке параметров, потребуется более одного раза, то лучше не изменять этого параметра, а использовать для работы вместо него вспомогательный, локальный, указатель. И присваивать ему значение параметра каждый раз, когда это значение понадобится.

Очередь

Очередь - линейно упорядоченный набор однотипных элементов неопределенной длины. Для каждого (с двумя исключениями) элемента очереди известен предыдущий элемент и следующий элемент.

Головной (первый) элемент очереди - тот, который не имеет предыдущего элемента. В непустой очереди существует ровно один такой элемент.

Хвостовой (последний) элемент очереди - тот, который не имеет последующего элемента. В непустой очереди существует ровно один такой элемент.

Текущий элемент очереди - тот, который рассматривается и обрабатывается в данный момент функционирования программы. Указатель текущего элемента - с его помощью описываются процедуры выбора текущего элемента и его обработки. В каждый момент текущим является тот элемент очереди, на котором стоит указатель текущего элемента.

Указатель текущего элемента можно перенести в голову очереди, в хвост очереди, или перемещать на один или несколько элементов очереди вперед или назад.

Добавление элемента очереди может быть произведено в голову очереди, в хвост очереди, перед или после текущего элемента. Текущим становится добавленный элемент.

Удаление элемента очереди возможно только для текущего элемента. После этого текущим становится следующий за ним элемент очереди, если таковой существует. При удалении последнего элемента очереди текущим становится новый последний элемент.

Следующий раздел