Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_Sys_05_00.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
162.3 Кб
Скачать

5.1.4. Отладка программы

Отладку программы следует вести по тому же плану, что и в работе ╧8. Следует, однако, отметить, что отслеживать значения в пошаговом режиме тут несколько труднее, ибо если в работе ╧8 мы могли видеть достаточно понятные значения индексов, то тут вместо них мы увидим значения указателей, более сложные для понимания. Поэтому мы рекомендуем больше полагаться на выявление ошибок путем анализа результатов программы.

5.1.5. Результаты работы программы

Образец результатов программы приведен ниже

size=69

Начальный массив:

-50 8 13 -16 11 -45 21 -12 -6 -45 17 21 41 36 -12 -42 24 -14 -9 -14

50 -31 -37 -49 48 -37 50 -20 -43 46 -30 33 21 24 -36 12 -20 -48 -27 -8

-6 -36 -21 -24 -31 8 -23 24 -33 13 -15 -6 -8 -43 -48 22 -49 49 19 12

18 -17 31 47 45 -2 28 42 -49

Массив-результат:

-50 8 13 -16 11 -45 21 -12 -6 -21 17 21 41 36 -12 -27 24 -12 -9 -12

50 -31 -37 -39 48 -37 50 -20 -31 46 -30 33 21 24 -36 12 -20 -24 -24 -8

-6 -24 -21 -24 -24 8 -23 24 -33 13 -15 -6 -8 -24 -24 22 -49 49 19 12

18 -17 31 47 45 -2 28 42 -49

5.2. Задание 2

5.2.1. Разработка спецификаций функции.

Дадим функции, которую мы создаем, имя substr(). Состав и типы ее параметров достаточно просто могут быть определены из задания: это должны быть строка-источник данных (src), строка-результат (dest), начальная позиция (pos) и длина результата (len).

Строки должны быть определены в той функции, которая вызывает нашу, следовательно, функции substr() передаются указатели на эти строки. Остальные параметры должны быть целыми числами. Обратите внимание на наши соображения по поводу размещения символьных строк. Вполне понятно, что память для строки-источника должна быть выделена во внешней функции. Но то же самое мы предусматриваем и для строки-результата - почему? Если мы объявим строку-результат как локальную в функции substr(), то память для нее будет выделена в нашей функции, и эта память будет освобождена, когда выполнение функции закончится, следовательно, та функция, которая вызвала нашу, воспользоваться результатом не сможет. Если же мы выделим память в нашей функции явным образом (с помощью malloc()), то память сохранится, но тогда на ту функцию, которая вызвала нашу, возлагается обязанность явным образом освободить эту память, когда строка-результат уже не будет нужна. Проанализируем возможности некорректного задания параметров при вызове функции. Во-первых, параметры pos и len не могут иметь отрицательного значения - оно просто не имеет смысла. Во-вторых, возможно такое значение параметра pos, которое будет превышать длину строки-источника. Будем считать все эти случаи ошибочным заданием параметров. Что должна делать функция при ошибочном задании параметров? Можно предложить три варианта:

1. Функция аварийно завершает работу всей программы.

2. Функция никак не реагирует на ошибку.

3. Функция возвращает какой-то признак ошибки.

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

Установим, что это значение будет 0 при нормальной работе функции, а при ошибке в параметрах это значение будет -1, а строка-результат будет пустой.

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

Еще одна проблема: если память для результата выделяет внешняя функция, что делать, если длина результата будет больше объема выделенной памяти? Чтобы контролировать эту ситуацию нужно ввести еще один параметр функции - максимальную длину строки-результата, а это нежелательно. Примем решение не контролировать такую ситуацию, перекладывая ответственность за нее на ту функцию, которая вызывает нашу. Это решения базируется на том, что именно так поступают и библиотечные функции языка С.

В итоге разработки спецификации для функции мы формулируем такое описание функции substr():

int substr(

char *src,

char *dest,

int pos,

int len);

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