Искусство программирования на Си (984073), страница 27
Текст из файла (страница 27)
Подумайте, например, об исПроблсма. связанная с этой идеей, заклочается в является основным вопросом. Наиболее важным явля- РЬЕ дее ттв ДЬЬОН пользовании Е)вей)шпйег вместо других переменных. $дегйве ттР аЫСН том, что для обеспечения относительно твердой гаран- ется гарантирование того, что в программу пользоватсТепсрь давайте заканчивать. Напишем тип структутии уникальности каждого случая выделения памяти, ля возвращается указатель, который пригоден для сохрары, которая может быть узлом в двоичном дереве.
Спе- $И3- ., Переенеинреннии н>ин С (не Уира синие наин мин $ Глава 8 Реализация библиотеки контроля памяти Функция Г)ейцйАЯосМешогуо является почти пол- геепгп р; функции, вы должны серьезно задуматься над правильной заменой функции шавосп.
Она требует два лопол- ностью своего проекта. Но довольно об интерфейсе. Теперь посмотРим, как в нительных парамет а: Б)е)ь)аше и ))пе(н)цшйег Олнако Нельзя непосредственно вызывать наш вариант функ- Серьезно задумавшись над этим я пришел к выво- действительности Работает пРогР™м~. В листинге 8.6) использующий библиотеку п аммист не должен бес- ции зцз)вро, потому что он не закажет достаточно памя- ду, что ошибся У меня не было никакого желания пи- демонстрируется реализация: покоиться об этом, поскольку для функции эти лара- тн лля ключа, сохраняемого функцией Тгас1сМешогу() сать й(ио(Ы*) всюлу в исхолных текстах программ.
По- метры определяются маской-макросом. Мы можем сделать нечто подобное с помощью №1ТЫег, этому я рассмотрел некоторыс другис возможности. Листинг 8.6. Исходный текст библиотеки контроля но мне кажется более понятным в этом случае просто Олной из них была илея помешать указатель в струк- памяти. иодЫ *Пеьпддд1осиевогу(неве Е эдне, реорганизовать копию программы, которая включает тУРу.
Неприятность этой идеи заключалась в том, что я дпд ЬдпевшпЬег) возможность отслеживания. (Изначазьно это было еде- должен был поместить Указатель в структУРУ, передать ( лано для ша(!ос са(йзс и геа11ос, но я обнаружил что структуру в качестве параметра получить указатель из )дпс1пде <аггдпд.ь> )дпс1пде <даве.Ь> иадд 'ргг; сЬаг е моту сократить исходный код на некоторое количество структуры в функции-оболочке, выполнить распрсделесаг ер; строк, улалив из кола не выполняющие отслеживание ние памяти, обновить указатель и позволить вызываю- $дпс1пде <аааегГ.Ь> рег = ва11ос(ятге + адгеот(дывд)); 1 ' ' т дыад) ); версии оболочек этих функций без потери функцио- шей функции опять получить указатель, как если бы он ддт(рдг (и ВОЬЬ) нальности).
рсазьно использовался. Все это очень долго и утоми- )дпс1пде "вевсгасХ.Ь" ( тельно, особенно для пользователя-програмл1иста. тгасхдевогу(ИВИтдд ИВИЬЬЬОС, Перепроектирование функции геа11ос Я всегда пьпаюсь избегать выполнения такой большой Функция в(гавр() нс входит в стандартную библио- О, работы и предпочитаю, чтобы ее выполняла библиоте- теку А)ч51 С. Тем не менее, она широко используется. ргг, Следующая задача — это отслеживание всех вызовов ка, когда это возможно. Однако я решил побиться луч- Поскольку функция з(гйпр() традиционно реализована вдзе, фу ц ф нкции-оболочки геа(1ос. Эта ф нкция, подобно д щего дизайна, а не кротко скопировать метод АХ51.
Залчюеичг лачхтию Глава 8 АЫСВ Кеуаеоге; Вечрег = р( не на|дел ни одной, которую счел бы достаточно хоро- Ьч1 = ЬааЬ2(кеу1); шей. Вот почему я решил использовать лве хеш-функ- Ьч2 = ЬааЬ2(кеу2); гй(рп)диев (= ЬЦЬЬ) ) 1((Ь 1 Ьч2) ( ции. 6111 = 1; геяаваелоЫ гееого Вечрег; Наша вторая программа хеширования улаживает все ) ) коллизии, вызванные первым алгоритмом, и базирует- е1ае зу[Ьч1 с Ьч2) Если в функцию перелан ненулевой указатель, мы ся на предположении, что не более чем 2)47483647 за- ( считаем.
что Указатель солсРжит адРес памЯти, Ранее божзае ся память которая была заказана Необхолимо казов памяти выполняется в процессе выполнения лю- ожзается память, которая ыла заказана. е холимо заказанный с помощью функции-оболочки из этой биб- о слеживать освобожление памяти так же как отсзежиотслежива~ь осво ожление памяти так же, как отслежи- бого теста. Я считаю, что это разумное прелположение.
е1ае (Если программа будет заказывать в среднем тысячу другими срелствами, то он не использУет этУ библио- ч функцией я Ггее котор я вна азе вызыва- блоков памяти в секунду, то исчерпание нашей уникаль- текУ. Таким обРазом, мы можем использовать ключ из ет Тгас()(евогу лля сообщения ей об освобожленин ной хсш-величины произойдет через три недели.) Для Если это предположение когда-нибудь окажется байтов. находящихся непосредственно перед персдан- библиотеки, которую прелполагается реально исполь- неверным, Я очень Уливлюсь. Единственный способ, ным в функцию адресом. зовать, этот вопрос необходимо рассмотреть более тша- позволаюший лостичь этого, заключаетсЯ в запУске тсчогв Реьодре1еаеемевогу(чогв *рзоогое, т ьно Лослольку это Отладочная библиотека я ч)в ста пр лолжительностью три с позовиной недели ко ствую себя достаточно безопасно Однако если ваши торый заказывает тысячу блоков в секунлу, и в этом зае ЫоевшаЬег) р -= аггеог(Аыцв!; требования более жесткие, воспользуйтесь таким при- случае вы можете РассмотРеть тРетью хеш-функцию, сЬаг 'рг близительным планом молификации: добавьте третью как " про'"ожил Ранее.
веверу(ькеувгоге.1е, р, агаеог(лысв)); АЫСВ Кеуяеоге( хеш-функцию и используйте ее, если первых лва хеш- аее Е(кеуз == Кеуа); ) алгоритма не смогли различить два ключа. Убедитесь, 1((раоогсе (= ВцЬЬ) Улрааениг плптыо ффффф Глава 8 Юфтей Перасаотреннии язаа С Часть 1 ем оператор освобождения памяти, ключ известен, по- Я опять должен кое в чем вам признаться. При первом твьавеу = Нептгас11дх++1 Ьгеак; Кеуэаоге.1п = ТЬзахеу; этому мы используем его.
написании этого кода я открывал файл в режиме "зг(", саве НЕНТЛК ЕЕРОЛТг Эта функция использует достаточно много статтгчес- подразумевая "создать текстовыи файл". Я знал, что с кеувеоге); ких переменных. Я не являюсь приверженцем статичес- использованием "гг" можно добиться того же результа- Йрсьптт(тр, ких переменных и использую их здесь вынужленно. та, но хотел достичь совершенства. В действительности зт(нпьь == ьаанепноае(анептгее, 1пНепогу Тгасхег Лерогт(п ); Я бы прсдгючел, чтобы пользовательский кол содержал же я достиг непереносимости.
Так что не используйте ТЬьввеу, трг)птт((р, авпегулп11дег)) 1п1п" ); структуру, в которой находилась бы необходимая ин- "тг(", подразумевая "и". формация, и передавал эту структуру в функпию по Наш указатель на файл сообшений о заказах памя- тргьптт(йр, Наше сообщение созластся достаточно легко это не необходимости, посредством функций выделения памя- ти является хорошим примером того, что нс всегда нс- ЕЛЛОЕ тп аевпялзпэ соле требует особых усилий. Пользователю было бы удобно, ти. К сожалению, программист, использующий библио- обхолимо отказываться от выполнения программы, если та11еа со ааа поле ео пепогу егее.1п ); еслибы мы включили в сообшенис информацию о лате телу, возможно, нс побеспокоится о передаче структур, запрос какого-либо ресурса терпит неудачу. Поскольку УТ1паЬ(т ( р): и времени. И мы делаем это (убелившись, конечно, что содержащих информацию о выделении памяти, в фун- сейчас мы работаем с тестовой библиотекой, а не с ра) е1ае функция )осайцпе не возврашает ошибку).
кции заказа памяти. Более того, эта структура не будет бочей системой, то имеем некоторую свободу. Мы мо( ее = еьее(зпп.ь); необходима, когда МЕМТВАСК не определен. Необхо- жем нс только изменить место вывода, но дюкс черкнуть Еае 1оса111пе(асе); димость учитывать эти сложности на уровне пользова- сообшение в з(бегг, давая возможность пользователю Успешно добавив новое сообшение о вылелении па- И (епе ~= НцЬЬ) тела-программиста приводит к невыносимым сложно- узнать, что у нас есть проблемы. мяти в дерево, мы можем проконтролировать выделение ( памяти другим способом. Можно подсчитать количество сЬаг еьпеЬаттес(64) (0); стям при использовании данной библиотеки.
Поэтому тр = тороп(МЕМтВЛСК Л1ЬЕНЛМЕ, "«"): байтов, выделенное пользователю, а также максималь- используются статические переменные, хотя они не 11(нвьь == )т( ВЬЬ == гр) ный объем памяти, выделенной в определенный момент. птгШпе(11певаутет, являются потокочувствительными. Пожалуйста, запом- ( агаеот ЬьпеЬпутег Переемнтреннееи яяья: С я Часть ) В ЭТОЙ ГЛАВЕ ° Пример выключателя света ° Превращение конечного автомата в код ° Применение моделирования и контроллеров ° Важные аспекты безопасности в использовании контроллеров ° Моделирование простого компьютера этом сейчас, вызвав(еггог, и тогда мы получим инфор- очень нравятся.
Я нс привожу здесь исходныс коды, мацию о любых проблемах, возникающих при выводе: поточу что эта глава посвящена проблемам управления Моделирование и контроллеры пал1ятью, а не деревьям! Конечно, вы можете найти мой ля (геггог (Гр) ) ( код лля работы с лерсвьями на СО-КОМ, но, пожатуй- Грг(ает(аеаегг, 'Вггог ег11(ав Со ста, не используйте его в качестве основы для собствен«1оч (11е.1а )) ной библиотеки работы с лерсвьями.