Искусство программирования на Си (984073), страница 28
Текст из файла (страница 28)
Для этого куда ) больше подходят реализации Бена для работы с дерегс1оае((р); вьями гсдмЫас)е и Але . ° Общее представление о конечных автоматах Ьгеак) детао1С: Просматривая весь материал, относящийся к этой Мэтью Ватсон Ьгеак) книге, на %еЬ-сайте издательства "ДиаСофт", вы найветс также управляющую программу, которая заказываез большой обьсм памяти и затем освобождает ее. Прогесога вггогасасеаг водите компиляцию после определения переменной МЕМТКАСК, если вы хотите контролировать память, двоичного лоиска оо дереег; ев иейлеее ил е и не определяйте ес — в противном случае.
ееов весте лрогреюев е Файле вевсгаса.с иа ИеЬ вЂ сав иелаеельсееа "Диеооае" */ Реэюме Итак, мы все сделали. Остается только рассмотреть собственно библиотечные функции для работы с дорс- Корректное использование памяти является существен- К ры окр жают нас повсюду. Перед появлени- стояний В любой момент времени механизм нахолит"я '" ло ' " "' ' о"я '" ло ' ло ' ' о"я '" ло ' ло ' ' о"я '" ло ' ' "" " ' ' '"'" ' '" "" ' ло ' ' '" " ' "" """ """ "" '~' ' ай~ с,е' "' а' ' "' ' ""» ' "Из "'," '' » ' ' », '' з ' " ' ' е ' ' зз"" "" "' а ';" ' '" '' ' ' ззхг Вор»смою/мнныи клык С Масть ( Пример выключателя света Мод»лир»монна и контра»»сры Глава 9 того, чтобы изменить состояние! Тем нс менее, этот код находится а определенном состоянии, входной сигнал В качестве чрезвычайно в код хорошо иллюструет общий принцип. Когда автомат обрабатывается а соответствии с состоянием, как пока- качестве чрезвычайно простого примера рассмотрим вано в листинги 9 2 выключатель саста.
У этого автомата есть только два возможны ояния: чен и вы е (рис. 9.2). еп Рь, когда У нас есть таблица и Реходов, мы меже Листинг 9.2. С5Т9 2.С вЂ” альтернативная реализация конечного автомата выключателя света. написать код, представленный а листинге 9.). Мы назовем эти состояния 5, и Бс Возможны два вход- /» Прпмер вмклечателяв два состоявея (вкппчеа влв пмклпчел); ных сигнала: включить и выключить. Назовем их ( и ) .
Листинг 9.1. (.5Т9 1.С и инг ...— конечный автомат два разлпчпмх входамх сигнала (вклпчвть, вмкппчить) '/ выключателя света. епип пепси ( ОРР = О, ОВ » /' Пример вмклпчатепя света: два состояния )) а»саная согнал (вкпичеа ели вмкпечеи); два различаих входпмх сигпала (включить, вмкппчвть) »/ епшв 1прит ( ПВ1ТСП ОРР = Е, аяттся оп епив птате ( ОРР, ) он )» (Еег(пе ВОН ЗТАТЕБ 2 2 / Иег(пе ВОН 1ВРОТЗ 2 епшв варит д ВВГТСП ОЯ впт павп() )1 РИСУНОК 92.
Выключатель сеато имеет тилысо Всю впе паве ( ) епив птатп Ьтчвтэкасев Превращение конечного автомата $Ш "'-""-'"" Ятоделктрт нонне и контраоепи Щ~ т т Часть 1 Глава 9 В этом плане С вЂ” чрезвычайно неумолимый язык. В результате результате уровень энергии оставался высоким, а Охоооо что большинство программистов использовази только маДругис языки программирования скорее удерязтвают вашу рсрттеновский фильтр нс был установлен. Вторая ошиб- Регистр Я лую част ь всех команд и наличие многих команл приво- руку, а С прелосгавляет веревку. чтобы повеситься. ка была найдена позднее. Лечение могло быль пролол- дило к снижению обшей эффективности. Был введен Конечно, есть много возможностей минимизировать жено при установке значения некоторой переменной Регистр В чип К)БС (Ведвссд 1пигосйоп Бег Сутр).
который имел вероятные ошибки. Написание!Г(з==х) позволит выл- равным нулю. Это означшю, что установлены и режим вить случайную ошибку тт(з=х). поскольку невозмож- облучения (фильтры), и мощность облучения. Эта пе- АСП Пвтпь набор команд Разнипа заклю талась в том что эт но присвоить какое-либо значение числу 3. Помогают ременная увеличивалась при каждом вызове конкретной ннп тпрсйспи Лрнфматнканпттесксе выс чипы были способны выполнять небольшое число и анализ кола, и тщательное тестирование.
и хорошая подпрограмтты при установке параметров лечения. Од- тстюпстта своих команд за короткий промежуток времени. Это мстолология программирования. нако переменная записывалась только в одном байте нако и б - ""'" оказгьтось возможным, поскольку небольшое количество В некоторых случаях программные средства наноси- (восемь битов), а подпрограмма вызывалась часто.
Это ОхГГГГ команд означает более высокую эффективность чипа. ли люлям ущерб. В описанном ниже случае программ- приводило к переполнению переменной, и се значение Рек нпрм Апреснае пространства Таблица 9.3. Регистры моделируемого компьюныс срслства явились прямой причиной смерти папи- становилось равным нулю. Если оператор начинат ле- РИСУНОК 9.4. Архитектура м одел иррел кого колтпьюпкера гера. сигов. Каждый, кто занимается программным чение в тот момент, котла происходило переполнение, обеспечением, должен знать об этой трагической исто- работала полная энергия пучка без всяких фильтров. Регистры Регистр Описание Вы можете найти полный, детальный доклад о Нткщ компьютер имеет четыре регистра (табл. 9.3).
Та Регистр А В-битовый регистр общего назначения Рассказ о ТЬегас-25 Т(вегас-25, написанный Ненси Левенсон ()чанс ( у ким образом, мы обеспечиваем минимальный уровень Регистр В 8-битовый регистр общего назначения Естспгюп) из Вашингтонского униве, итога (()пктсгд)гу сложности. Регистр Счетчик команд. Это регистр файлов только Тйсгас-25 был медипинским линейным ускорителем, о(маь1нп юп) аж нале 1ЕЕЕ, то(. 26, )Чо. 7, 01 ЕЕ, 'о. 26, )Чо. 7, 30111993.
При моделировании компьютера число кол<вид бу- счетчика для считывания (с точки зрения спроектированным и построенным в начале вй х ()н пе - дсг ьктщимальным Тем не менее даже с ограничеанцтт команд пользовате Моаоирооокио и контри.мери ффффф Глава 9 Мйй Пореоиотреккий кзик С Ф ( Часть 1 Этот список содержи~ большинство (в отношении Листинг 9.4. Ь5Т9 4.С вЂ” определения типа. Листинг 9.5. Ь5Т9 5.С вЂ” список команд.
[П[еотвте АООКЕЯ ура е ЬОАОА, пользуемых во многих 8-битовых процессорах. Хотя с орекдив ттрк; ЬОАОВ, точки зрения современных стандартов это и простые команлы, но их реализация была достижением в техно- СУРВаат логии микропроцсссоров 70-х годов. ( ИОР, сваг' 1автгасе(оанаве) Построение С-кода ОРЕВАНО ттре Оратаев; АООА, ятокев, АООВ, Сейчас поговорим немного о проектировании.
Модель ) 1НЯТКОСТ10Н) лолжна обладать следующими функциональными воз- СОНРВ1, можностями: ВЬТ, Существует два возможных способа анализа данных. ВЯТ ° Читать файлы кода ассемблера и собирать их в па- Первый заключается в анализе каждой строки: сравне- ЗОНР, мяти ние полученной строки с именами команд: РК1ИТА ВКВАК )) ° Выполнять программу в памяти ( О асеса1р (токо», "ЬОАОВ")) ° Выполнять программу пошагово, по олной команле Можно также хешировать Тойев каким-либо метоза один раз дом.
гарантирующим уникальность обласзи команд, и Листинг 9.6. Ь5Т9 6.С вЂ” синтаксический разбор листинга ассемблера. ° Проверять содержимое регистров выполнять переключение по хеш-индексу. Нам слслу- ввтьа [КОЬЬ [- говея [Ыав, НАХ ЫНЕ, РР )) ет написать несколько строк кода для обработки каж веавьс 1НЯТКОСТ1ОИ 1аатгасттоаТаньв[) = ( ЬОАОА ЬОАОВ' ЬОАОА1 ЬОАОВ1 НОР р *ЯТОКЕА 'ЯТОКЕВ "АООА 'АООВ СОМРА1 СОНРВ1 'ВЬТ*, 'ВЯТ 'ЛДГР', "РК1ИТА ВКЕАК АООКЕЯЯ, АООКЕЯЯ, 1НМЕО1АТЕ тнневтвте ионк, АООКЕЯЯ, АООВЕЯЯ, тнневтвте 1ИНЕО1АТВ тммеотатк тмнеогвте АООКЕЯЯ, АООКЕЯЯ, АООКЕЯЯ, ионе, ионе, !)ереемотренный язые С 1 Гя [езироттие и нт тра азери ! Глава 9 )* вам веобходамо авеста одва дополватепьаый байт в память '! зй ( 1ННЕОЗдта == зпаегпсеьоп.прогале) Невюгу [Невьоса11оп) = аегео1 (Текел, НПЬЬ, 16); НеаЬосаезоп++1 ) Бувбо1 = Р(пй Токае (Тойеп); !' мавава поддервавает распоповевае "от старвего к младвему '! Немоту [Невьосае1оп) = (Вувбо1.Ьосае1оп » 8) Ь ОхРРЗ НевЬосаггоп++; Немоту [НевЬосаезоп) = вувбо1ьосагзоп ЬахРР; НевЬосаезоп++; Часть [ Проверка содержимого памяти дпоп строки, козорый использует э(г(оК Если вы ис используезс посзояпио бибзлззсззсчнукз фуикиию з[г(ой ДР)заЯ пРостаЯ ф)икпиа Оии Яыволзп иа печюь содсР стандарта А[хб[, зо это прскрасиая возможность позпажимое палзяти, о байтов в каемзои выходиои с~роке.
Это коз!иться с иси поближе. Вы наилезс е в библио. екс даст иачальиыи и коисчиыи адреса. )* аам веобходамо авеста два дополавтельаых байта в вамять *! Дисассемблирование содержимого памяти 11 ( АООВЕЕЯ == 1пвегпсбйоп.орегапп) В лсйствитсльиости это деиствис, образное первому (счизывадию фаила и компоновке с~о в памяти). Нрзз Эта1лава даст вам возможиосзь ползчить ииформапию задаииых иачальисзм и конечиол~ алресах фуикпия де- о коисчиых автоматах и диаграммах сосмкчиия, козорая кодирует команды, иаходяиизсся в памяти. Это может позволит вам осугдсствлять программирование простых быть полезно для проверки а!реса перехода, при толи прилюров, Здса рассказывается ~акме об использовании что метка зказываез па это! а.зрсс.
Например, строка мстола моделироваиия в пролзьпплеппости. Чзпазсль позиаколзи~ с» с программами, которые дззиг з.ввез. ) использукзт контроллеры, и узнает, какои вред оии трансформируется в могут нанести. Как пример более сложио1о моделироваиив рассматривается модслирс1вапис прсктого фоиисимаиовского компьюзсра. Начальная ячейка памяти определяется пользовате- (счетчик команд) и эй (состояиия устройства), чтеиис Собираем все вместе Вы теперь знаете, насколько разнообразно можно рглуж ге Глава 10 В ЭТОЙ ГЛАВЕ ° Что такое рекурсия ° Как испо н,зовать рек) рсию ° О рекурсии подробнее ° Практическое прил~ененис рекурсии Рекурсия рг1от(("Ъе11о, вот16Гхп ); Например, 4'это 4"(39, что.
в свою очередь, равно гесиги 0; 4*(3'(2)3. а:зто — 4*(ЗЧ2*Г(Д)). Данная величина рав- на (4'3'2*)3, или 24. Значение 5! сводится к 5'4!, или В некоторых языкал нужно проделать лшого лопол- )20 Как вы видите, величина о)определяется через нительной работы. чтобы вызвать функиию. сели это вру~не факторивлы.
Это полходит для рекурсивной реприведез к вьоову сю самой себя, пусть даже и нспря- алнзапии, прниеденной в листинге 10.). мому. В С этого нет. Вот олин совершенно тривиальный Листинг 10.1. Функция, вычисляющая факториал. 01 1ооя Гастогйа1(тос х) ( иоаляпео лог ГГиигср Е'иба гесигве о С(яев(ивв1дией (ос о) ( 02 11 (х == 1) 03 гесигп 1; 1( (о == О) 04 телика х ' Гвссогла1(х - 1); тетига Ор е1ае телего геситве о 1(вев(и — 1) + 1; ) Как работ ает этот код' Дананге ~ пкмотрим, что проЭта функпня возврагпас! свой арг)мент.
Но кокон нслоднт с Гас(опа)(4) в пиша)овол1 режиме. (Если вы муч1пельныи путь она проходит' Если в нее перелает- никогла нс проводили зрасснровку кода вручную, то ся число, которое больше н)ля, функиия вызывает себя сеичас для ного наст) пнл прекрасный момент; это сдсэто число раз, только чтобы возвратить величину, изна- ласт рек)рсию намного более понятнои.) Все начина"Чтобы пошиь рекурсию, сначала и) жно попязь рек)р- кб роищ нскоторыс рек) рспвныс рсгпи запив чрезвычально переданную сй. ется с вызова Гас(опа)(4) //ерес ютреыыыйяеые С /'екеж ие е е е Часть 1 глава 10 ствуст специальная область памяти, козорая называет- С точки зрения математики это точно и корректно; Пример использования: двоичный поиск ет осушествлять поиск "под" ним.
В конечном счете ся стеком и используется для лрансння переменных с на самом леле чшематнкн любят описывать функции автоматическим выделением памяти н возврата этих зна- именно так. Однако, возврашаясь к С, можно сказать, Прнмс1зом разумного использования рекурсии являетчений. Дру/ие компьютеры ос>шествляют зто иным чзо это неправильное употребление рекурсии.