Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК СИ_РУКОВОДСТВО ПРОГРАММИСТА.doc
Скачиваний:
12
Добавлен:
18.08.2019
Размер:
438.27 Кб
Скачать

1.2. Нефайловая работа с терминалом

Существует много приложений (различные экранные редакторы, игры), в которых требуется активное и нестандартное взаимодействие с терминалом. Описываемые в данной главе функции и обеспечивают возможность такого взаимодействия. Необходимо отметить, что описываемые функции не зависят от стандартных функций работы с файлами (хотя и оказывают некоторое влияние на работу последних).

_getchar();

вводит символ непосредственно с терминала. Возвращает <ВК> как два

символа:'\r' и '\n' (<ПС> как '\n').

char c;

_putchar(c);

выводит символ 'c' на терминал. Не добавляет '\r' при выводе '\n'.

char *s;

_puts(s);

выводит строку "s" на терминал. Не добавляет '\r' при выводе '\n',

добавляет "\r\n" в конце строки в данной реализации!!!!!!!!! По

стандарту не должна добавлять "\r\n" в конце строки

int mode; /* 0,1,2 */

$ttymode(mode);

устанавливает режим ввода с терминала в зависимости от значения mode

0 - стандартный режим - ввод осуществляется с системным эхоотобра­жением и буферизацией строки (программа получает символы только после завершения строки). Этот режим установлен по умолчанию.

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

2 - режим посимвольной активации без ожидания - как и в предыду­щем режиме, однако при отсутствии введенного символа ожидание не выполняеся, функция _getchar() (и getchar(), если файл ввода с терминала открыт с ключом 'n') возвращают '\0'. Оказывает соответствующее влияние на ввод с терминала и при использовании стандартных функций ввода. Корректно работает и в TS мониторе ОС РАФОС.

int mode; /* 0 - запретить, 1 - разрешить */

$ttylc(mode);

разрешает или запрещает ввод букв нижнего регистра (lower case)

1.3. Управление распределением динамической памяти

Средства управления динамической памятью не входят в язык "СИ", однако существует стандартный набор функций управления памятью. Этот набор содержит функции, позволяющие получать необходимые блоки памяти, а также возвращать ненужные больше блоки для повторного использования. Длина блоков указывается в байтах, и часто в качестве длины используется результат, возвращаемый конструкцией sizeof(...). Структура памяти при работе системы распределения памяти представляет собой связанный (и даже замкнутый в кольцо) список блоков, адреса элементов которого монотонно возрастают на рабочем участке. При запросе памяти всегда выделяется четное число байт (и возвращается указатель, выровненный по границе слова), причем дополнительно резервируется служебное слово (два байта), которое располагается в начале блока и содержит адрес следующего блока и информацию о занятости текущего блока (младший бит установлен, если блок занят, и сброшен, если свободен). В конце рабочего участка памяти находится служебное слово, соответствующее фиктивному блоку и содержащее указатель на начало списка. Более подробную информацию о внутренней организации функций распределения динамической памяти СМ."Руководство программиста. Библиотеки. Управление распределением динамической памяти".

unsigned size;

char *

malloc(size);

char*

alloc(size);

резервирует в области динамической памяти указанное в size число байт

и возвращает указатель на на первый из них (всегда выровнен по

границе слова). При необходимости дополнительная память

резервируется у операционной системы (при помощи функции sbreak()).

Если запрос не может быть удовлетворен, malloc() возвращает null. alloc() аналогична malloc() за исключением того, что в случае ?невозможности удовлетворить запрос она возвращает не NULL, а -1. Эта

функция является устаревшей и присутствует лишь для совместимости с библиотекой ОС UNIX V6. Пользоваться ей не рекомендуется (тем более, что она работает через malloc()).

char *p; /* указатель на блок */

free(p);

mfree(p);

освобождает участок (блок) памяти, зарезервированный по malloc(). После освобождения этот участок (или его часть) вновь может быть распределен при помощи функции malloc(). Ничего не возвращает. Следует отметить, что попытка возвратить участок памяти, не Jполученный по malloc(), приведет к аварийному завершению задачи по инструкции BPT. mfree() полностью аналогична free() (является ее альтернативным входом).

int n; /* чило элементов */

int m; /* размер одного эл-та в байтах */

char *

calloc(n, m); /* NULL если нет памяти */

char *p;

cfree(p);

резервирует участок памяти, достаточный для размещения n элементов длиной по m байт каждый. Возвращаемый участок памяти обнуляется. Возвращает указатель на начало участка или NULL, если требуемый участок не может быть выделен. Резервирует память при помощи

malloc(), поэтому освободить зарезервированный участок можно вызовом free(), однако присутствует и функция cfree(), которая аналогична free() (и работает через нее).

char *buff; /* адрес участка, полученного по malloc */ unsigned size; /* новый размер */

char *

realloc(buff, size);

изменяет размер участка памяти, ранее полученного по malloc(), на size. buff - указатель на этот участок. realloc() возвращает указатель на участок требуемого размера или NULL, если запрос не может быть выполнен. При выполнении realloc() участок памяти может быть перемещен, однако содержимое участка сохраняется (переносится). Понятно, что сохраняется участок размера, равного минимуму из старого и нового размеров. Если realloc() возвращает NULL, то старый участок освобождается и содержимое его теряется.

int amount;

char *

sbreak(amount);

резервирует участок памяти у операционной системы. Возвратить этот участок памяти невозможно. При последовательных вызовах sbreak() выделяется непрерывная память, никаких служебных областей не заводится. Является основным и единственным (легальным) средством получить участок памяти у ОС. Функция malloc() в конце концов тоже обращается к sbreak(). Функция sbreak() корректно работает как в SJ/FB/XM мониторах ОС RT11, так и в TS мониторе (через .tstop), а также в эмуляторе ОС RT11 ОС ДОС КП. Возвращает адрес выделенного участка или NULL, если запрос не может быть удовлетворен. sbreak(0) возвращает текущую верхнюю границу используемой памяти (адрес первого свободного слова памяти).

int n;

char *

salloc(n); /* NULL если нет места */

резервирует n байт в стеке задачи. Возвращает указатель (выровненный

по границе слова) на начало зарезервированного участка,или NULL,

если удовлетворить запрос невозможно (стек опускается ниже 0700).

Зарезервированный участок будет автоматически освобожден при

возврате из функции, выполнившей salloc(); явно освободить зарезервированный участок невозможно. Не может использоваться в качестве аргумента другой функции, т.к.при вызове функции происходят операции со стеком: выполнение

subr(salloc(10),20);

приведет к ошибке. обойти это можно так:

temp = salloc(10);

subr(temp, 20);

char *in; /* откуда */

char *out; /* куда */

char nbytes; /* сколько байт */

copy(out, in, nbytes);

коприрует указанное число байт. Возвращает указатель на первый свободный после копирования байт в области out.

char *addr;

int nbytes;

zero(addr, nbytes);

Обнуляет участок памяти. Ничего не возвращает.