Искусство программирования на Си (984073), страница 24
Текст из файла (страница 24)
Она статическая, поэтому ле ЫИЕ, 1 * будет загромондать ване пространство вмев. ° / исправление кода программ //ересматренный нзык С Часто ! ГЛЗВЗ 7 ( ОаувЯЬпсе1999 + ТеагбЯ1псе1999 $ 400 ) 1((ур 1н бЫОПГ) Хс1ове((р) ) ) ОаувЯЬпсе1999 += Иов.св удау е 1 е1ве ( / ° Гаравтвруел, что чвсло содерввт ве более четврел двфр '/ Оауввгпсе1999 $= 10000) гу(соппсег < СРОЬЬОМ МАХЬХМЕ) ( Ррг1пту((рг '$0н10 $12в ($56) вргАВГХ(ОоГР11еМаве, С$04Ы$ОЫ$0Ы.$010$090 Оаув01псе1999, Иов.св Ьопг, Иов.св З1п / 10, Иов.тв З1п $ 10, Иов.тв вес)1 СопптегвгИЬЬ ++сонпгег, 1пР11еИазе, ЬАВВИпвьег); ) Рог(1 = 01 г < таьмжь * Оерсьд 1+4) ( Хрг1ЗГХ(ур, ); чоы СРо11оы(сЬаг * 1пу11ЗИаве, ) 1пт Ьупедпзьег, Хпс ОерсбдодШег, чХРг1пту((Р, Рогвагбсг1пд, АгдЬЬВГ)1 сЬаг * Рогвасбсг1пд, Ррг1псг(ур, "1п ); тгереемотреииый ииик С ЮЧасть > Ип рооееиые кодо ирограыи Глава 7 ИЙИ ными аргументами, как и при использовании Грпд>Г шннство проектов не удовлетворяют ни одному из пе- Ксрниган и Пайк (Кепнкйап, Рйае) нс придержива- в голову приходит и множество других возможностей.
обычным способом. Препроцессор проследит за исполь- рсчисленных критериев. Поэтому мы не можем сказать, ются метода Л>ГвеГ ВЕВ()О, считая, что это сделает те- В хорошо структурированном окружении может ока- зованием ну:кного числа аргументов в макросе, что нео- что мы никогда нс делаем ошибок. Если вы будете из- стирояание более проблематичным. Вместо этого они загася полезным.
если при каждом выполнении про- жиданно, но весьма приветствуется. начально предполагать, что ошибки будут иметь место, рекомендуют следующее: грамма будет вносить запись в базу данных, сохраняя Иногда удобно ввести трасснровочные циклы Если, то сможете планировать свой ответный удар н таким влыш ( Раввин = О ); такие детали, как номер версии программы, дата, вре- например, мы хотим вывести все содержимое массива, образом уменьшить их воздействие. Существует множе- мя, !В компьютера и пользователя, аргументы команд- бьшо бы хорошо использовать для этого цикл. Без со- ство полезных методов для возможно более раннего ГГ(ВЕВОС> ной строки, имя файла данных для теста, рабочие харак- мнения, и в этом случае мы предпочтем трассировоч- обнаруэксния ошибки: правильный выбор цели, макети- ргглге(....
теристики и тысячи других полезных вещей. Конечно, это ный код Поэтому я предлагаю простой макрос рованис, чувствнтельныс стратегии тестирования, экс- Опи утверждают, что многие компиляторы не создаогие ком о ы не созда не может быль сделано только вА)чб( С, поэтом) я не буду СЕ СОВЕ, который позволит заключить в него следу- пертная оценка, итеративные методологии разработки, ют прог амму операторов отладки если ВЕВ()О вдаватьса в подробности. Но пРедставьте себе созданные юший код: модульное строение программ, процедуры управления становчен в значение б но тем нс менее п оволят таким обРазом Удобства, когда, напРимеР, длЯ того, сь' сове ((> их изменениями, а также материальное стимулирование проверку синтаксиса (удо ство, которос вы тсрястс, б т о кот о вы тс я т чтобы сравнить эффективность Различных версий пропрограммисзов, создающих надежные программы, и т.д.
вы.о„,яя .,Овнов компилирование) Когда я стояк граммы, до"аточно про выпОлнить БОБ запрос в сг сове( г (' = в; ' < )в; '++» Все эти методы важны, но ни один из них не относитнулся с тако ' точкой зрения, то не нашел в стандарте й СГ СОВЕ( Г ЕОЬЬОИ2(*агг(ад> = (Ьд)'гв", 1, ся исключительно к программированию на языке С, д)ЧБ> с никаких гарантий того что компилятор нс бу- ЛаДОЧНОГО КОДа ОГРаНИЧЕНа ТОЛЬКО тРЕбОВаНИЯМИ Злра- ср сове(» ' агг(г>);) поэтому мы не будем их здесь рассматривать. Если вы дет и не должен создавать код лля недоступных о ласс зд в к д лля недоступных облас- вого смысла и вашим вообРажением. хотитс про юсть больше об общем качестве программ.
тей программы. Этот метод может хорошо работать на Вы можете написать ешс проще я настоятельно рекомендую прекрасную книгу Стива вашем компиляторе (в этом случае, конечно, используйспользование операторов контроля еггпвг сроььои ои Мак Копн<да (~гаге К(сСоппсл) Соверш<ними код те его).
тем не менее, если необхолимым требованием Операторы контроля проверяют логику вашей програм- йерееиитреииииязие С //егории ~ение ходи лригрики Яффа ! ЧзстЫ Глава 7 ИЙЙИ чается в том, чтобы найти симптом, и затем поискать патти значит, вы недостаточно хорошо изучили свою Архив Укаргона содержит четыре смешных названия танется отверстие. Я никогда не находил моль ни в одрядом непосредственную причину Например, мы ви- программу,ивтакомслучаеимеетсмыслперсписатьес, дтя различных типов ошибок, все они назва//ы в честь ной из своих маш~н, ню пауки часто вызывают проблемы (этим, возможно, объясняется отсутствие моли).
Я живу дим, что рг(в(Г записывает несуразицу в выходной по- используя более простой (возможно, более нудный) известных ученых (Нильса Бора, Вернера Гсйзснбсрга, в надежде, ито в один прекрасный день они обнаружат ток. В конце концов, мы отслеживаем его в отладчике путь. Бенуа Мандельброта и Эрвина Шредингера). Оци к/ас- мировую иву~пну тг/от/е) хг//е)е т//еЬ (здесь снова игра и находим, что это вывод строки.
Может ли указатель Успех отладки полное/ью определяется вашим по- сифицированы скорее по их симптомах/, чем по прнчи- слов; чегет(е) 'г/к(е 'Феб — всемирная паутина. — Примеч. на символ иметь значение )ъс)ЕЕ? Поэтому л/ы добав- ниманисм программы. Если вы прекрасно изучили свою нам, их вьыываюшим.
Если вы поняли, что где-то есть пер.) и исчезнут из оей жизни навсегда. лаем некоторый трассировочный код (или запрашива- программу, она нс будет иметь ошибок. Но, чтобы про- ошибка, намного вероятное, что вы знастс симгпол/, а ем в отладчике значение указателя) и определяем, что вести отладку, вы не должны ждать появления ошибок. не причину, поэтому это действительно вполне полсз- Ошибки Бора — это чаше всего простые ошибки лоэто нс ХСЕЬ. Но, тем не менее, выводятся явно иска- Почему бы пе выполнить в пошаговом режил/е новук ная ктасспфикация.
Рассмотрим каждый из них и изу гики приложений, простые ошибки на единицу, обычженныс данные. Проверка подпрограл/мы показывает, программу сразу после сс написания? Это хороший чим некоторые методы поиска различных причин, их но не связанные с границей массива, опечатки, привочто данный указатель передается в текущую ф)нкцию способ проверить тот факт, что ваша программа слсду- вызываюших. как параметр.
Слслуюший шаг — посмотреть в стеке, где ет намеченной путеводной нити выполнения, и выявить ш/учайно заломмснтированпыс части программы и друэта функция вызывается. Дви/аясь таким образом в об- проблемы на ранней стадии, еще до того, как они мо- Ошибки Бора (Волг Вод~) гис приземленные вещи. ратнол/ направлении, мы сможем достаточно быстро тут стоить вам реальных денег. Ошибка Бора — это ошибка, имею/цая простукт (хотя, определить причину искажения данных. Не позволяй- возможно, неизвестную) причину.
Если причина обнатс ошибкам запугивать вас. Их можно отследить, и в (ИПЫ ОШИ6ОК ружсна и )делена или внесены изменения нужным об- Гсйзснбаг — это прекрасное название для рассматривазтом состоит их уязвимость. емого здесь класса ошибок, и я бы хотел быть его авто- Если вам удалось откомпилировать программу, то ка- разом, ошибка пропалает. /акис детерхц/нистичсские емого здесь класса ошибок, и я бы хотел быть его ав Нс обязательно постоянно отслеживать выполнение ошибки проще всего найти и исправить. К счастью, Ром.
Каламбур очень улачсн; я не физик, но. насколь- каждой отдельной строки кода. Используйт~ возможноко по двум причинам: либо программа нс следует ваше- большинство ошибок попадает именно в зту категорию. ко " пол'ню принци" неопРедслснн с " ко я помню, п ип ип неон едслснности Гсйзенбе га Перес.нотренныингык С Испра ем ение кодо программ ! Часть! Глава 7 оессру(р, Ч); главе. Это долгая и н благодарная работа, но она дсй- Когда мы обнаружим сегмент программы, в котором, Как сделать так, чтобы сопровождающий вашу програмг е — некого ый оп стимый указатель казывакз- ствительно приносит РезУльтаты.
как нам кажется, находится ошибка, мы вернемся к му специалист любил вас и через десять лет, а нс проупорной детективной работе. клинал ваше имяУ Убедитесь, что следующие вещи наОшибка Мандельброта (Мапде! Ьау) дсжно сохранены и при необходимости будут доступны Ошибка Шредингера (5сЬгоейпЬоаб) такому специалисту: же, как он выделяет память для любой другой перемен- Некоторые ошибки какутся совершенно случайными.
ной. Содержимое, находящееся по адресу, на который Лежащие в их основе причины представляются нспос- Можст быть, с небольшой натяжкой, но существуют ° Компьютер, работающий под управлением нузкной указывает переменная р, может быть произвольным, тнжимо сложными, как легендарное множество Ман- нссомненныс случаи ошибки Шредингера. В знамени- опсрационной системы Каковы шансы па то, что р указывает на безопасную дсльброта, в честь которого они и названы.
Кюкется, что том умозритсльнсгм экспеРименте Шредингера "Кот" ° Компилят кото ый был использован пе вонаомпилятор, которы область памяти". Их вычислить нельзя. Возможно, р вы не можстс последовательно воспроизвести се. Про- гипотетичсский кот помещается в закРытУю коРобкУ чально — никогда не выбрасывайте СП со старыми указывает на безопасную область, а может быть, и нет.
грамма работает в течение только 70% времени (для пРи обстоЯтельствах, которые приводат к Удивительно- к мпилято ам„, компиляторами. Точно сказать нельзя. конкретных входных данных) или работает только вне му выводу — кот оказывается живым и мертвым в одно Ошибка Гсйзенбсрга возникает, ссзи р нс указываст отладчика (в противоположность ошибки Гсйзснбсрга), и то зке время. на безопасную областьпамяти, вызывая ошибку выпол- или выдает ложныс результаты в среду, нли работает Заглянув в коробку, мы сводим две возможности к рые были использованы нсния программы. Поэтому вы запускастс отлалчик, что только на компькзтере Джоя, илн прерывает выполнс- одной определенности.