45940 (665245), страница 20

Файл №665245 45940 (Язык С) 20 страница45940 (665245) страница 202016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 20)

ALLOCP имеет значение NULL, как в случае первого обращения к

ALLOC, то создается вырожденный свободный список: он состоит

из свободного блока размера нуль и указателя на самого себя.

В любом случае затем исследуется свободный список. Поиск

свободного блока подходящего размера начинается с того места

(ALLOCP), где был найден последний блок; такая стратегия по-

могает сохранить однородность диска. Если найден слишком

большой блок, то пользователю предлагается его хвостовая

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

нужно изменить только его размер. Во всех случаях возвращае-

мый пользователю указатель указывает на действительно сво-

бодную область, лежащую на единицу дальше заголовка. Обрати-

те внимание на то, что функция ALLOC перед возвращением “P”

преобразует его в указатель на символы.

Функция MORECORE получает память от операционной систе-

мы. Детали того, как это осуществляется, меняются, конечно,

от системы к системе. На системе UNIX точка входа SBRK(N)

возвращает указатель на “N” дополнительных байтов памя-

ти.(указатель удволетворяет всем ограничениям на выравнива-

ние). Так как запрос к системе на выделение памяти является

сравнительно дорогой операцией, мы не хотим делать это при

каждом обращении к функции ALLOC. Поэтому функция MORECORE

округляет затребованное число единиц до большего значения;

этот больший блок будет затем разделен так, как необходимо.

Масштабирующая величина является параметром, который может

быть подобран в соответствии с необходимостью.

  • 183 -

#DEFINE NALLOC 128 /*#UNITS TO ALLOCATE AT ONCE*/

STATIC HEADER *MORECORE(NU) /*ASK SYSTEM FOR MEMORY*/

UNSIGNED NU;

\(

CHAR *SBRK();

REGISTER CHAR *CP;

REGISTER HEADER *UP;

REGISTER INT RNU;

RNU=NALLOC*((NU+NALLOC-1)/NALLOC);

CP=SBRK(RNU*SIZEOF(HEADER));

IF ((INT)CP==-1) /*NO SPACE AT ALL*/

RETURN(NULL);

UP=(HEADER *)CP;

UP->S.SIZE=RNU;

FREE((CHAR *)(UP+1));

RETURN(ALLOCP);

\)

Если больше не осталось свободного пространства, то фун-

кция SBRK возвращает “-1”, хотя NULL был бы лучшим выбором.

Для надежности сравнения “-1” должна быть преобразована к

типу INT. Снова приходится многократно использовать явные

преобразования (перевод) типов, чтобы обеспечить определен-

ную независимость функций от деталей представления указате-

лей на различных машинах.

И последнее - сама функция FREE. Начиная с ALLOCP, она

просто просматривает свободный список в поиске места для

введения свободного блока. Это место находится либо между

двумя существующими блоками, либо в одном из концов списка.

В любом случае, если освободившийся блок примыкает к одному

из соседних, смежные блоки объединяются. Следить нужно толь-

ко затем, чтобы указатели указывали на то, что нужно, и что-

бы размеры были установлены правильно.

FREE(AP) /*PUT BLOCKE AP IN FREE LIST*/

CHAR *AP;

\(

REGISTER HEADER *P, *G;

P=(HEADER*)AP-1; /*POINT TO HEADER*/

FOR (G=ALLOCP; !(P>G && P>G->S.PTR);G=G->S.PTR)

IF (G>=G->S.PTR && (P>G \!\! PS.PTR))

BREAK; /*AT ONE END OR OTHER*/

IF (P+P->S.SIZE==G->S.PTR)\(/*JOIN TO UPPER NBR*/

P->S.SIZE += G->S.PTR->S.SIZE;

P->S.PTR = G->S.PTR->S.PTR;

\) ELSE

P->S.PTR = G->S.PTR;

IF (G+G->S.SIZE==P) \( /*JOIN TO LOWER NBR*/

G->S.SIZE+=P->S.SIZE;

G->S.PTR=P->S.PTR;

\) ELSE

G->S.PTR=P;

ALLOCP = G;

\)

  • 184 -

Хотя распределение памяти по своей сути зависит от ис-

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

как эту зависимость можно регулировать и ограничить весьма

небольшой частью программы. Использование TYPEDEF и UNION

позволяет справиться с выравниванием (при условии, что функ-

ция SBRK обеспечивает подходящий указатель). Переводы типов

организуют выполнение явного преобразования типов и даже

справляются с неудачно разработанным системным интерфейсом.

И хотя рассмотренные здесь подробности связаны с распределе-

нием памяти, общий подход равным образом применим и к другим

ситуациям.

Упражнение 8-6.

Функция из стандартной библиотеки CALLOC(N,SIZE) возвра-

щает указатель на “N” объектов размера SIZE, причем соответ-

ствующая память инициализируется на нуль. напишите программу

для CALLOC, используя функцию ALLOC либо в качестве образца,

либо как функцию, к которой происходит обращение.

Упражнение 8-7.

Функция ALLOC принимает затребованный размер, не прове-

ряя его правдоподобности; функция FREE полагает, что тот

блок, который она должна освободить, содержит правильное

значение в поле размера. Усовершенствуйте эти процедуры,

затратив больше усилий на проверку ошибок.

Упражнение 8-8.

Напишите функцию BFREE(P,N), которая включает произволь-

ный блок “P” из “N” символов в список свободных блоков, уп-

равляемый функциями ALLOC и FREE. С помощью функции BFREE

пользователь может в любое время добавлять в свободный спи-

сок статический или внешний массив.

  • 185 -

9. Приложение А: справочное руководство по языку 'C'

9.1. Введение

Это руководство описывает язык 'с' для компьютеров DEC

PDP-11, HONEYWELL 6000, IBM система/370 и INTERDATA 8/32.

там, где есть расхождения, мы сосредотачиваемся на версии

для PDP-11, стремясь в то же время указать детали, которые

зависят от реализации. За малым исключением, эти расхождения

непосредственно обусловлены основными свойствами используе-

мого аппаратного оборудования; различные компиляторы обычно

вполне совместимы.

10. Лексические соглашения

Имеется шесть классов лексем: идентификаторы, ключевые

слова, константы, строки, операции и другие разделители.

Пробелы, табуляции , новые строки и комментарии (совместно,

“пустые промежутки”), как описано ниже, игнорируются, за ис-

ключением тех случаев, когда они служат разделителями лек-

сем. Необходим какой-то пустой промежуток для разделения

идентификаторов, ключевых слов и констант, которые в против-

ном случае сольются.

Если сделан разбор входного потока на лексемы вплоть до

данного символа, то в качестве следующей лексемы берется са-

мая длинная строка символов, которая еще может представлять

собой лексему.

10.1. Комментарии

Комментарий открывается символами /* и заканчивается

символами /*. Комментарии не вкладываются друг в друга.

10.2. Идентификаторы (имена)

Идентификатор - это последовательность букв и цифр; пер-

вый символ должен быть буквой. Подчеркивание _ считается

буквой. Буквы нижнего и верхнего регистров различаются. зна-

чащими являются не более, чем первые восемь символов, хотя

можно использовать и больше. На внешние идентификаторы, ко-

торые используются различными ассемблерами и загрузчиками,

накладыватся более жесткие ограничения:

DEC PDP-11 7 символов, 2 регистра

HONEYWELL 6000 6 символов, 1 регистр

IBM 360/370 7 символов, 1 регистр

INTERDATA 8/32 8 символов, 2 регистра

  • 186 -

10.3. Ключевые слова

Следующие идентификаторы зарезервированы для использова-

ния в качестве ключевых слов и не могут использоваться иным

образом:

INT EXTERN ELSE

CHAR REGISTER FOR

FLOAT TYPEDEF DO

DOUBLE STATIC WHILE

STRUCT GOTO SWITCH

UNION RETURN CASE

LONG SIZEOF DEFAULT

SHORT BREAK ENTRY

UNSIGNED CONTINUE

*AUTO IF

Ключевое слово ENTRY в настоящее время не используется ка-

ким-либо компилятором; оно зарезервировано для использования

в будущем. В некоторых реализациях резервируется также слова

FORTRAN и ASM

10.4. Константы

Имеется несколько видов констант, которые перечислены ниже.

В пункте 10.6 резюмируются характеристики аппаратных сред-

ств, которые влияют на размеры.

10.4.1. Целые константы

Целая константа, состоящая из последовательности цифр,

считается восьмеричной, если она начинается с 0 (цифра

нуль), и десятичной в противном случае. Цифры 8 и 9 имеют

восьмеричные значения 10 и 11 соответственно. Последователь-

ность цифр, которой предшествуют символы 0х (нуль, х-малень-

кое) или 0х (нуль х-большое), рассматривается как шестнадца-

тиричное целое. Шестнадцатиричные цифры включают буквы от а

(маленькое) или а (большое) до F (маленькое) или F (большое)

со значениями от 10 до 15. Десятичная константа, величина

которой превышает наибольшее машинное целое со знаком, счи-

тается длинной; восмеричная или шестнадцатиричная константа,

которое превышает наибольшее машинное целое без знака, также

считается длинной.

10.4.2. Явные длинные константы

Десятичная, восмеричная или шестнадцатиричная константа,

за которой непосредственно следует L (эль-маленькое) или L

(эль-большое), является длинной константой. Как обсуждается

ниже, на некоторых машинах целые и длинные значения могут

рассматриваться как идентичные.

10.4.3. Символьные константы

Символьная константа - это символ, заключенный в одиноч-

ные кавычки, как, например, 'X'. Значением символьной конс-

танты является численное значение этого символа в машинном

представлении набора символов.

  • 187 -

Некоторые неграфические символы, одиночная кавычка ' и

обратная косая черта \ могут быть представлены в соответст-

вии со следующей таблицей условных последовательностей:

новая строка NL/LF/ \N

горизонтальная табуляция HT \T

символ возврата на одну позицию BS \B

возврат каретки CR \R

переход на новую страницу FF \F

обратная косая черта \ \\

одиночная кавычка ' \'

комбинация битов DDD \DDD

Условная последовательность \DDD состоит из обратной ко-

сой черты, за которой следуют 1,2 или 3 восмеричных цифры,

которые рассмативаются как задающие значение желаемого сим-

вола. Специальным случаем этой конструкции является последо-

вательность \0 (за нулем не следует цифра), которая опреде-

ляет символ NUL. если следующий за обратной косой чертой

символ не совпадает с одним из указанных, то обратная косая

черта игнорируется.

10.4.4. Плавающие константы

Плавающая константа состоит из целой части, десятичной

точки, дробной части, буквы E (маленькая) или E (большая) и

целой экспоненты с необязательным знаком. Как целая, так и

дробная часть являются последовательностью цифр. Либо целая,

либо дробная часть (но не обе) может отсутствовать; либо де-

сятичная точка, либо е (маленькая) и экспонента (но не то и

другое одновременно) может отсутствовать. Каждая плавающая

константа считается имеющей двойную точность.

10.5. Строки

Строка - это последовательность символов, заключенная в

двойные кавычки, как, наприимер,”...”. Строка имеет тип

“массив массивов” и класс памяти STATIC (см. Пункт 4 ниже).

Строка инициализирована указанными в ней символами. Все

строки, даже идентично записанные, считаются различными.

Компилятор помещает в конец каждой строки нулевой байт \0, с

тем чтобы просматривающая строку программа могла определить

ее конец. Перед стоящим внутри строки символом двойной ка-

вычки “ должен быть поставлен символ обратной косой черты \;

кроме того, могут использоваться те же условия последова-

тельности, что и в символьных константах. И последнее, об-

ратная косая черта \, за которой непосредственно следует

символ новой строки, игнорируется.

  • 188 -

10.6. Характеристики аппаратных средств

Следующая ниже таблица суммирует некоторые свойства ап-

паратного оборудования, которые меняются от машины к машине.

Хотя они и влияют на переносимость программ, на практике они

представляют маленькую проблему, чем это может казаться за-

ранее.

Таблица 1

Характеристики

Тип файла
Документ
Размер
2,35 Mb
Материал
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6529
Авторов
на СтудИзбе
301
Средний доход
с одного платного файла
Обучение Подробнее