Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП_Экзамен.doc
Скачиваний:
25
Добавлен:
16.09.2019
Размер:
347.14 Кб
Скачать

16.Способы экономии памяти

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

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

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

Также следует помнить, что при передаче структурных данных в подпрограмму «по значению» копии этих данных размещаются в стеке. Избежать копирования иногда удается, если передавать данные «по ссылке», но как неизменяемые (описанные const). В последнем случае в стеке размеща­ется только адрес данных(функции).

17,Программирование «с защитой от ошибок»

Любая из ошибок программирования, которая не обнаруживается на этапах компиляции и компоновки программы, в конечном счете, может проявиться тремя способами: привести к выдаче системного сообщения об ошибке, «зависанию» компьютера и получению неверных результатов.

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

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

Детальный анализ ошибок и их возможных ранних проявлений показывает, что целесообразно проверять:

• правильность выполнения операций ввода-вывода;

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

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

ошибки передачи - аппаратные средства, например, вследствие неисправности, искажают данные;

ошибки преобразования - программа неверно преобразует исходные данные из входного формата во внутренний;

ошибки перезаписи - пользователь ошибается при вводе данных, например, вводит лишний или другой символ;

ошибки данныхпользователь вводит неверные данные. Ошибки передачи обычно контролируются аппаратно.

Для защиты от ошибок преобразования данные после ввода обычно сра­зу демонстрируют пользователю («эхо»). При этом выполняют сначала пре­образование во внутренний формат, а затем обратно. Однако предотвратить все ошибки преобразования на данном этапе обычно крайне сложно, поэто­му соответствующие фрагменты программы тщательно тестируют [31], ис­пользуя методы эквивалентного разбиения и граничных значений.

Обнаружить и устранить ошибки перезаписи можно только, если пользователь вводит избыточные данные, например контрольные суммы. Если ввод избыточных данных по каким-либо причинам нежелателен, то следует по возможности проверять вводимые данные, хотя бы контролировать интер­валы возможных значений, которые обычно определены в техническом зада­нии, и выводить введенные данные для проверки пользователю.

Неверные данные обычно может обнаружить только пользователь.

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

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

• если каким-либо образом вычисляется индекс элемента массива, то следует проверить, что этот индекс является допустимым;

• если строится цикл, количество повторений которого определяется значением переменной, то целесообразно убедиться, что значение этой переменной не отрицательно;

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

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

• избегать вычитания близких чисел (машинный ноль);

• избегать деления больших чисел на малые;

• сложение длинной последовательности чисел начинать с меньших по абсолютной величине;

• стремиться по возможности уменьшать количество операций;

• использовать методы с известными оценками погрешностей;

• не использовать условие равенства вещественных чисел;

• вычисления производить с двойной точностью, а результат выдавать -с одинарной.

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

Для перехвата и обработки аппаратно и программно фиксируемых ошибок в некоторых языках программирования, например, Delphi Pascal, C++ и Java, предусмотрены средства обработки исключений. Использование этих средств позволяет не допустить выдачи пользователю сообщения об аварий­ном завершении программы, ничего ему не говорящего. Вместо этого программист получает возможность предусмотреть действия, которые позволят исправить эту ошибку или, если это невозможно, выдать пользователю сооб­щение с точным описанием ситуации и продолжить работу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]