7 Структурное программирование 2012
.pdf
|
|
21 |
|
|
|
cacos, cacosf, cacosl |
Комплексный |
арккосинус |
cacosh, cacoshf, cacoshl |
Комплексный |
гиперболический арккосинус |
carg, cargf, cargl |
Аргумент комплексного числа |
|
casin, casinf, casinl |
Комплексный |
арксинус |
casinh, casinhf, casinhl |
Комплексный |
гиперболический арксинус |
catan, catanf, catanl |
Комплексный |
арктангенс |
catanh, catanhf, catanhl |
Комплексный |
гиперболический арктангенс |
ccos, ccosf, ccosl |
Комплексный |
косинус |
ccosh, ccoshf, ccoshl |
Комплексный |
гиперболический косинус |
cexp, cexpf, cexpl |
Комплексная |
экспонента |
cimag, cimagf, cimagl |
Мнимая часть комплексного числа |
|
clog, clogf, clogl |
Натуральный |
логарифм комплексного числа |
conj, conjf, conjl |
Комплексное |
сопряжённое число |
cpow, cpowf, cpowl |
Степень комплексного числа |
|
cproj, cprojf, cprojl |
Проекция на |
римановскую сферу |
creal, crealf, creall |
Действительная часть комплексного числа |
|
csin, csinf, csinl |
Комплексный |
синус |
csinh, csinhf, csinhl |
Комплексный |
гиперболический синус |
csqrt, csqrtf, csqrtl |
Комплексный |
квадратный корень |
ctan, ctanf, ctanl |
Комплексный |
тангенс |
ctanh, ctanhf, ctanhl |
Комплексный |
гиперболический тангенс |
7.12.3 Ресурсы модуля string
Модуль включает типы (таблица Таблица 7.7) и функции (Таблица 7.8) для работы со строками символов. Строковые функции модуля string используются только с набором символов ASCII или его совместимыми расширениями (например, такими как ISO-8859- 1); многобайтовые кодировки (такие как UTF-8) могут использоваться при условии, что «длина» строки будет определяться как число байтов, а не число символов Юнико-
да, которым они соответствуют. Несовместимые с ASCII |
строки обычно обрабатываются |
|||||||
с помощью ресурсов модуля wchar. |
|
|
|
|||||
|
Таблица 7.7 - Константа и тип подуля string |
|
|
|
||||
|
|
|
|
|
|
|
|
|
Имя |
|
|
|
Примечания |
|
|
|
|
NULL |
|
расширяется в null pointer; значение, которое гарантированно не яв- |
|
|||||
|
|
ляется валидным адресом оперативной памяти |
|
|
||||
|
|
|
|
|
||||
size_t |
беззнаковое |
целое, имеющее тот же тип, что и результат оператора |
|
|||||
|
|
sizeof |
|
|
|
|
|
|
|
Таблица 7.8 - Функции модуля string |
|
|
|
||||
|
|
|
|
|
|
|||
|
|
Имя |
|
|
Примечания |
|
||
void *memcpy(void *dest, const void |
копирует n байт из области памяти src в dest, ко- |
|
||||||
*src, size_t n); |
|
|
торые не должны пересекаться, в противном случае |
|
||||
|
|
|
|
|
результат неопределен (возможно как правильное |
|
||
|
|
|
|
|
копирование, так и нет) |
|
|
|
void |
*memmove(void |
*dest, |
const |
копирует n байт из области памяти src в dest, ко- |
|
|||
void *src, size_t n); |
|
|
торые в отличие от memcpy могут перекрываться |
|
||||
void *memchr(const void *s, char c, |
возвращает указатель на первое вхождение c в пер- |
|
||||||
size_t n); |
|
|
|
вых n байтах s, или NULL, если не найдено |
|
|||
int memcmp(const void *s1, const |
сравнивает первые n символов в областях памяти |
|
||||||
void *s2, size_t n); |
|
|
|
|
|
|
||
void |
*memset(void |
*, int z, |
заполняет область памяти одним байтом z |
|
||||
size_t); |
|
|
|
|
|
|
|
|
char *strcat(char *dest, const char |
дописывает строку src |
в конец dest |
|
|||||
*src); |
|
|
|
|
|
|
|
|
char |
*strncat(char |
*dest, |
const |
дописывает не более |
n |
начальных симолов строки |
|
|
char *, size_t); |
|
|
src (или всю src, если ее длина меньше) в конец |
|
||||
|
|
|
|
|
dest |
|
|
|
char *strchr(const char *, int); |
ищет символ в строке, начиная с головы и возраща- |
|
||||||
|
|
|
|
|
ет его адрес, или NULL если не найден |
|
22
char *strrchr(const char *, int); |
ищет символ в строке, начиная с хвоста и возраща- |
||||||
|
|
|
|
|
ет его адрес, или NULL если не найден |
|
|
int strcmp(const char *, const char |
лексикографическое сравнение строк |
|
|
||||
*); |
|
|
|
|
|
|
|
int |
strncmp(const |
char |
*, |
const |
лексикографическое сравнение первых |
n |
байтов |
char *, size_t); |
|
|
|
строк |
|
|
|
int |
strcoll(const |
char |
*, |
const |
лексикографическое сравнение строк с учетом лока- |
||
char *); |
|
|
|
ли collating order |
|
|
|
char |
*strcpy(char |
*toHere, |
const |
копирует строку из одного места в другое |
|
||
char *fromHere); |
|
|
|
|
|
|
|
char |
*strncpy(char |
*toHere, |
const |
копирует до n байт строки из одного места в дру- |
|||
char *fromHere, size_t n); |
|
гое |
|
|
|||
char *strerror(int); |
|
|
|
возвращает строковое представление сообщения об |
|||
|
|
|
|
|
ошибке errno (не потоко-безопасная) |
|
|
size_t strlen(const char *); |
|
возвращает длину строки |
|
|
|||
size_t strspn(const char *s, const |
определяет максимальную длину начальной подстро- |
||||||
char *accept); |
|
|
|
ки, состоящей исключительно из байтов, перечис- |
|||
|
|
|
|
|
ленных в accept |
|
|
size_t strcspn(const char *s, const |
определяет максимальную длину начальной подстро- |
||||||
char *reject); |
|
|
|
ки, состоящей исключительно из байтов, не пере- |
|||
|
|
|
|
|
численных в reject |
|
|
char *strpbrk(const char *s, const |
находит первое вхождение любого символа, перечис- |
||||||
char *accept); |
|
|
|
ленного в accept |
|
|
|
char |
*strstr(const |
char |
*haystack, |
находит первое вхождение строки needle |
в haystack |
||
const char *needle); |
|
|
|
|
|
|
|
char *strtok(char *, const char *); |
преобразует строку в последовательность токенов. |
||||||
size_t strxfrm(char *dest, const |
создает оттранслированную копию строки, |
такую, |
|||||
char *src, size_t n); |
|
|
что дословное сравнение ее (strcmp) будет эквива- |
||||
|
|
|
|
|
лентно |
|
|
7.12.4 Ресурсы модуля stdlib
Модуль stdlib из стандартной библиотеки общего назначения языка С содержит функции для выделения памяти (Таблица 7.11), генрации псевдослучайных чисел (Таблица 7.10), контроля процесса выполнения программы (Таблица 7.12), преобразования типов (Таблица 7.9) и другие (таблицы Таблица 7.13 - Таблица 7.15). Этот модуль в C++ известен как cstdlib. Название «stdlib» расшифровывается как «standard library» - стандартная библиотека.
Таблица 7.9 - Функции преобразование типов модуля stdlib
Имя |
|
|
Описание |
atof |
строка преобразуется в число двойной точности (НЕ float) |
||
atoi |
строка преобразуется в целое число |
||
atol |
строка преобразуется в длинное целое число |
||
strtod |
строка преобразуется в число двойной точности (double) |
||
strtol |
строка преобразуется в длинное целое число |
||
strtoul |
строка преобразуется в беззнаковое длинное целое число (unsigned long |
||
|
int) |
|
|
Таблица 7.10 - Функции для генерации псевдослучайных последовательностей |
|||
|
|
|
|
Имя |
|
|
Описание |
rand |
|
генерирует псевдослучайное значение |
|
srand |
|
устанавливает начальное значение генератора псевдослучайных чисел |
|
Таблица 7.11 – Функции для выделения и освобождения динамической памяти |
|||
|
|
|
|
|
Имя |
Описание |
|
malloc, calloc, realloc |
Выделяют часть динамической памяти из «кучи» |
||
free |
|
|
освобождает занятую часть динамической памяти обратно |
|
|
|
в «кучу» |
23
Таблица 7.12 - Функции для контроля процесса выполнения программы
Имя |
|
Описание |
|
abort |
некорректное завершение выполнения |
|
|
atexit |
регистрирует обратный вызов функции для выхода из программы |
||
exit |
завершает выполнение программы |
|
|
getenv |
извлекает переменные окружения |
|
|
system |
выполняет внешнюю команду |
|
|
Таблица 7.13 - Функции для сортировки и поиска модуля stdlib |
|||
|
|
|
|
Имя |
|
Описание |
|
bsearch |
двоичный поиск в массиве |
|
|
qsort |
сортировка массива |
|
|
Таблица 7.14 - Математические функции модуля stdlib |
|||
|
|
|
|
Имя |
|
Описание |
|
abs, labs |
абсолютная величина |
|
|
div, ldiv |
деление целых чисел |
|
|
Таблица 7.15 - Функции для многобайтовых операций и широких символов |
|||
|
|
|
|
|
Имя |
|
Описание |
mblen |
|
размер многобайтовых символов |
|
mbtowc, wctomb, mbstowcs, wcstombs |
преобразование |
многобайтовых и широких |
|
|
|
символов |
|
7.12.5 Ресурсы модуля stdio
Модуль stdio (от англ. standard input/output header — стандартный заголовоч-
ный файл ввода/вывода) из стандартной библиотеки языка Си, содержит определения макросов, константы (Таблица 7.18), переменные (Таблица 7.19), объявления функций (таблицы Таблица 7.16 и Таблица 7.17) и типов, используемых для различных операций стандартного ввода и вывода. Язык C++ для совместимости использует stdio наряду со схожим по функциональности модулем cstdio.
Таблица 7.16 -Функции модуля stdio для файловых операций
Имя |
|
Описание |
fclose |
|
закрывает файл, ассоциированный с переданным ей значением |
|
|
FILE * |
fopen, freopen, fdopen |
открывают файл для определенных типов чтения и записи |
|
remove |
|
удаляет файл (стирая его) |
rename |
|
переименовывает файл |
rewind |
|
работает аналогично fseek, вызванному для потока, со сбро- |
|
|
сом индикатора ошибок |
tmpfile |
|
создает и открывает временный файл, удаляемый при закрытии |
|
|
через fclose |
Таблица 7.17 - Функции для операций ввода-вывода |
||
|
|
|
Имя |
|
Описание |
clearerr |
очищает EOF и индикаторы ошибок для данного потока |
|
feof |
проверяет, установлен ли индикатор EOF для данного потока |
|
ferror |
проверяет, установлен ли индикатор ошибок для данного потока |
|
fflush |
принудительно записывает вывод, предназначенный для помещения в бу- |
|
|
фер, в файл, ассоциированный с данным потоком |
|
fgetpos |
сохраняет позицию указателя файла потока, ассоциированный с его |
|
|
первым аргументом (FILE *), в его второй аргумент (fpos_t *) |
|
fgetc |
возвращает один символ из файла |
|
fgets |
получает строку из файла (оканчивающуюся символом перевода строки |
|
|
или конца файла) |
|
fputc |
записывает один символ в файл |
|
fputs |
записывает строку в файл |
|
24 |
|
|
Имя |
Описание |
ftell |
возвращает указатель позиции файла, который может быть передан |
|
fseek |
fseek |
производит смещение от текущей позиции в файле на указанное количе- |
|
ство байт,или от его начала или конца, в указаном направление. |
fsetpos |
устанавливает указатель позиции файла потока, ассоциированный с его |
|
первым аргументом (FILE *), как хранимый во втором его аргументе |
|
(fpos_t *) |
fread |
читает данные из файла |
fwrite |
записывает данные в файл |
getc |
считывает и возвращает символ из данного потока и изменяет указа- |
|
тель позиции файла; позволяет использоваться как макрос с теми же |
|
эффектами, что и fgetc, кроме того, что может вычислять поток более |
|
одного раза |
getchar |
имеет аналогичный эффект, что и getc(stdin) |
gets |
считывает символы из stdin до символа перевода строки и хранит их в |
|
своем единственном аргументе |
printf, |
используются для вывода в стандартный поток вывода |
vprintf |
|
fprintf, |
используются для вывода в файл |
vfprintf |
|
sprintf, |
используются для вывода в массив типа char (Строка в языке Си) |
snprintf, |
|
vsprintf |
|
perror |
записывает сообщение об ошибке в stderr |
putc |
записывает и возвращает символ в поток и изменяет указатель позиции |
|
файла на него; можно использовать как макрос с теми же свойствами, |
|
что и fputc, кроме того, что он может обрабатывать поток более од- |
|
ного раза |
putchar, |
аналогичны putc(stdout) |
fputchar |
|
scanf, |
используются для ввода из стандартного потока ввода |
vscanf |
|
fscanf, |
используются для ввода из файла |
vfscanf |
|
sscanf, |
используются для ввода из массива char (то есть Строка в языке Си) |
vsscanf |
|
Setbuf, |
устанавливает режим буферизации для данного потока |
setvbuf |
|
tmpnam |
создает временное имя файла |
ungetc |
помещает символ обратно в поток |
puts |
выводит символьную строку в stdout |
Таблица 7.18 - Константы-члены модуля stdio
Имя |
Описание |
|
EOF |
отрицательное целое число типа int, используемое для обозначения |
|
|
конца файла |
|
|
|
|
BUFSIZ |
целое число, равное размеру буфера, используемое |
функцией |
|
setbuf() |
|
FILENAME_MAX |
размер массива char, достаточного для хранения имени любого фай- |
|
|
ла, который может быть открыт |
|
FOPEN_MAX |
число файлов, которые могут быть открыты одновременно; как мини- |
|
|
мум равно 8 |
|
_IOFBF |
сокращение от «input/output fully buffered» (полностью буферируе- |
|
|
мый ввод/вывод); целое число, которое может быть передано функции |
|
|
setvbuf() для запроса блока буфера ввода и вывода для открытого |
|
|
потока |
|
_IOLBF |
сокращение от «input/output line buffered» (линейно буферируемый |
|
|
ввод/вывод); целое число, которое может быть передано функции |
|
|
setvbuf() для запроса линии буфера ввода и вывода для |
открытого |
|
25 |
|
|
|
потока |
_IONBF |
сокращение от «input/output not buffered» (не буферируемый |
|
ввод/вывод); целое число, которое может быть передано функции |
|
setvbuf() для запроса небуферированого ввода и вывода для откры- |
|
того потока |
L_tmpnam |
размер массива char, достаточного для хранения временного имени |
|
файла, сгенерированного функцией tmpnam() |
NULL |
макрос, расширяющий константу нулевого указателя; то есть, кон- |
|
станту, представляющую значение указателя, гарантированно указы- |
|
вающего несуществующий адрес объекта в памяти |
SEEK_CUR |
целое число, которое может быть передано функции fseek() для за- |
|
проса позиционирования относительно текущей позиции в файле |
SEEK_END |
целое число, которое может быть передано функции fseek() для за- |
|
проса позиционирования относительно конца файла |
|
|
SEEK_SET |
целое число, которое может быть передано функции fseek() для за- |
|
проса позиционирования относительно начала файла |
|
|
TMP_MAX |
максимальное число уникальных имен файлов, генерируемых функцией |
|
tmpnam(); как минимум 25 |
Таблица 7.19 - Переменные члены модуля stdio
Имя |
|
|
|
|
Описание |
|
stdin |
указатель на FILE, указывающий на стандартный поток ввода |
|||||
stdout |
указатель |
на |
FILE, |
указывающий |
на |
стандартный поток вывода. |
stderr |
указатель |
на |
FILE, |
указывающий |
на |
стандартный поток ошибок. |
7.12.6 Ресурсы модуля time
Модуль time из файл стандартной библиотеки языка программирования С содержит типы (Таблица 7.23), константы (Таблица 7.22) и функции (Таблица 7.21Таблица 7.20) для работы с датой и временем. Отдельные функции модуля могут работать с местным временем, которое может отличаться от календарного, например в связи с часовыми поясами. В модуле также определены арифметические типы clock_t и time_t для представ-
ления времени и |
тип-структура tm, содержащая компоненты-поля календарного времени |
|||
(Таблица 7.20). |
|
|
|
|
Таблица 7.20 - Состав полей типа tm из модуля time |
||||
|
|
|
||
Тип и имя поля |
Описание назначения поля |
|
||
int tm_sec |
|
|
Секунды от начала минуты(0,59) |
|
int tm_min |
|
|
Минуты от начала часа(0,59) |
|
int tm_hour |
|
Часы от полуночи(0,23) |
|
|
int tm_mday |
|
Число месяца(1,31) |
|
|
int tm_mon |
|
|
Месяцы после января(0,11) |
|
int tm_year |
|
Годы с 1900 |
|
|
int tm_wday |
|
Дни с воскресенья(0,6) |
|
|
int tm_yday |
|
Дни с первого января(0,365) |
|
|
int tm_isdst |
|
Признак летнего времени |
|
|
Таблица 7.21 - Основные функции модуля time |
||||
|
|
|||
Наименование и интерфейс |
Описание |
|
||
clock_t clock(void) |
Возвращает время, измеряемое процессором в тактах от |
|
||
|
|
|
начала выполнения программы, или −1, если оно не из- |
|
|
|
|
вестно. Пересчет этого времени в секунды выполняется |
|
|
|
|
по формуле clock () / CLOCKS_PER_SEC. |
|
time t time(time_t *tp) |
Возвращает текущее календарное время или −1, если это |
|
||
|
|
|
время не известно. Если указатель tp не равен NULL, |
|
|
|
|
то возвращаемое значение записывается также и в *tp. |
|
double difftime |
|
Возвращает разность time2-time1, выраженную в секун- |
|
|
(time_t |
time2, |
time_t |
дах. |
|
time1) |
|
|
|
|
time_t mktime |
|
Преобразует местное время, заданное структурой *tp, в |
|
|
|
|
26 |
|
|
|
|
(struct tm *tp) |
|
|
календарное и возвращает его в том же виде, что и |
|
|
|
функция time(). Компоненты структуры будут иметь зна- |
|
|
|
чения в указанных выше диапазонах. Функция возвращает |
|
|
|
календарное время или −1, если оно не представимо. |
char *asctime |
|
|
Преобразует время из структуры *tp в строку вида "Sun |
(const struct tm *tp) |
|
Jan 3 15:14:13 1988\n\0" |
|
Таблица 7.22 - Константы модуля time |
|||
|
|
|
|
Наименование |
|
|
Описание |
|
|
||
CLOCKS_PER_SEC |
Определяет количество тактов системных часов в секунду. Ис- |
||
|
пользуется для пересчета величины, возвращаемой функцией |
||
|
clock(), в секунды. |
||
CLK_PER_SEC |
Альтернативное имя константы CLOCKS_PER_SEC, используемое в |
||
|
некоторых библиотеках. |
||
CLK_TCK |
Вышедший из употребления макрос для константы CLOCKS_PER_SEC. |
||
Таблица 7.23 - Типы данных модуля time |
|||
|
|
|
|
Наименование |
|
|
Описание |
clock_t |
Возвращается функцией clock(). Обычно определён как int или |
||
|
long int. |
|
|
time_t |
Возвращается функцией time(). Обычно определён как int или |
||
|
long int. |
|
7.12.7 Ресурсы модуля float
Модуль float из стандартной библиотеки языка программирования С, содержит макросы, определяющие различные ограничения и параметры типов с плавающей точкой:
1)макрос FLT_ROUNDS задает способ округления при сложении чисел с плавающей
точкой:
−значение −1 — не определено
−значение 0 — в сторону нуля;
−значение 1 — в сторону ближайшего числа;
−значение 2 — к положительной бесконечности;
−значение 3 — к отрицательной бесконечности;
−другие значения означают, что отдается преимущество машинно-зависимому способу округления;
2)макрос FLT_EVAL_METHOD — определяет форматы результатов вычислений, включающий типы с плавающей точкой:
−значение −1 — не определено;
−значение 0 — привести результаты всех операций и константы лишь с точностью до типа;
−значение 1 — привести результаты операций и константы типов float и double к типу double;
−значение 2 — привести результаты операций и констант к типу long double;
−другие значения означают, что отдается преимущество машинно-зависимому способу округления.
3)макрос FLT_RADIX — основание для представления порядка, например: 2, 16;
4)макрос FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG — количество цифр по ос-
нованию FLT_RADIX в мантиссе;
5)макрос DECIMAL_DIG — (хотя бы 10);
6)макросы FLT_DIG, DBL_DIG, LDBL_DIG — количество верных десятичных цифр;
7)макросы FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP
8)макрос FLT_MIN_10_EXP, DBL_MIN_10_EXP, LDBL_MIN_10_EXP, (хотя бы -37);
9)макрос FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP;
10)макрос FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP (хотя бы +37);
11)макросы FLT_MAX, DBL_MAX, LDBL_MAX — максимальное число с плавающей точ-
кой;
12)макросы FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON — минимальное х, такое, что 1.0 + x != 1.0;
27
13) макросы FLT_MIN, DBL_MIN, LDBL_MIN — минимальное нормализованное число с плавающей точкой.
7.12.8 Ресурсы модуля errno
Заголовочный файл errno.h из стандартной библиотеки языка программирования С содержит объявление макроса для идентификации ошибок через их код. Сообщение о ошибке может быть получено с помощью функции strerror или напечатано с помощью perror. Стандарт POSIX определяет символьные имена ошибок согласно таблице 14.24.
Таблица 7.24Символьные имена ошибок из errno
Имя ошибки |
Описание |
E2BIG |
Список аргументов слишком длинный |
EACCES |
Отказ в доступе |
EADDRINUSE |
Адрес используется |
EADDRNOTAVAIL |
Адрес недоступен |
EAFNOSUPPORT |
Семейство адресов не поддерживается |
EAGAIN |
Ресурс временно недоступен |
EALREADY |
Соединение уже устанавливается |
EBADF |
Неправильный дескриптор файла |
EBADMSG |
Неправильное сообщение |
EBUSY |
Ресурс занят |
ECANCELED |
Операция отменена |
ECHILD |
Нет дочернего процесса |
ECONNABORTED |
Соединение прервано |
ECONNFRFUSED |
Соединение отклонено |
EDEADLK |
Обход тупика ресурсов |
EDESTADDRREQ |
Требуется адрес назначения |
EDOM |
Ошибка области определения |
EDQUOT |
Зарезервировано |
EEXIST |
Файл существует |
EFAULT |
Неправильный адрес |
EFBIG |
Файл слишком велик |
EHOSTUNREACH |
Хост недоступен |
EIDRM |
Идентификатор удален |
EILSEQ |
Ошибочная последовательность байтов |
EINPROGRESS |
Операция в процессе выполнения |
EINTR |
Прерванный вызов функции |
EINVAL |
Неправильный аргумент |
EIO |
Ошибка ввода-вывода |
EISCONN |
Сокет (уже) соединен |
EISDIR |
Это каталог |
ELOOP |
Слишком много уровней символических ссылок |
EMFILE |
Слишком много открытых файлов |
EMLINK |
Слишком много связей |
EMSGSIZE |
Неопределённая длина буфера сообщения |
EMULTIHOP |
Зарезервировано |
ENAMETOOLONG |
Имя файла слишком длинное |
ENETDOWN |
Сеть не работает |
ENETRESET |
Соединение прервано сетью |
ENETUNREACH |
Сеть недоступна |
ENFILE |
Слишком много открытых файлов в системе |
ENOBUFS |
Буферное пространство недоступно |
ENODEV |
Нет такого устройства |
ENOENT |
Нет такого файла в каталоге |
ENOEXEC |
Ошибка формата исполняемого файла |
ENOLCK |
Блокировка недоступна |
ENOLINK |
Зарезервировано |
ENOMEM |
Недостаточно памяти |
|
28 |
|
|
ENOMSG |
Сообщение нужного типа отсутствует |
ENOPROTOOPT |
Протокол недоступен |
ENOSPC |
Памяти на устройстве не осталось |
ENOSYS |
Функция не реализована |
ENOTCONN |
Сокет не соединен |
ENOTDIR |
Это не каталог |
ENOTEMPTY |
Каталог непустой |
ENOTSOCK |
Это не сокет |
ENOTSUP |
Не поддерживается |
ENOTTY |
Неопределённая операция управления вводом-выводом |
ENXIO |
Нет такого устройства или адреса |
EOPNOTSUPP |
Операция сокета не поддерживается |
EOVERFLOW |
Слишком большое значение для типа данных |
EPERM |
Операция не разрешена |
EPIPE |
Разрушенный канал |
EPROTO |
Ошибка протокола |
EPROTONOSUPPORT |
Протокол не поддерживается |
EPROTOTYPE |
Ошибочный тип протокола для сокета |
ERANGE |
Результат слишком велик |
EROFS |
Файловая система только на чтение |
ESPIPE |
Неправильное позиционирование |
ESRCH |
Нет такого процесса |
ESTALE |
Зарезервировано |
ETIMEDOUT |
Операция задержана |
ETXTBSY |
Текстовый файл занят |
EWOULDBLOCK |
Блокирующая операция |
EXDEV |
Неопределённая связь |
7.12.9 Ресурсы модуля iostream в языке С++
Модуль iostream из стандартной библиотеки языка программирования C++ содержит классы, функции (Таблица 7.25 - Функции модуля iostream), манипуляторы (Таблица 7.26) и переменные для организации консольного ввода-вывода. Название модуля образовано на английском языке от сокращения Input/Output Stream - «поток вводавывода». Модуль управляет вводом-выводом аналогично stdio в языке C. iostream использует объекты cin, cout, cerr и clog для передачи информации в и из стандартных потоков ввода, вывода, ошибок (без буферизации) и ошибок (с буферизацией) соответственно.
Таблица 7.25 - Функции модуля iostream
Наименование |
Описание |
width(int x) |
минимальное число знаков до следующего вывода |
fill(char x) |
устанавливает символ-заполнитель и возвращает предыдущий сим- |
|
вол-заполнитель. По умолчанию в качестве символа-заполнителя |
|
используется пробел |
precision(int x) |
устанавливает число значащих знаков для чисел с плавающей |
|
точкой |
Таблица 7.26 - Манипуляторы модуля iostream |
|
|
|
Наименование |
Описание |
endl |
перевод строки |
flush |
выгружает содержимое буфера в поток |
dec |
меняет формат вывода числа на десятичный |
oct |
меняет формат вывода числа на восьмеричный |
hex |
меняет формат вывода числа на шестнадцатеричный |
ws |
извлекает и удаляет символы пустых промежутков из потока |
showpos |
показывает + перед неотрицательными числами |
showpoint |
показывает десятичную точку |
noshowpoint |
скрывает десятичную точку |
29
Начиная с версии Visual Studio .NET 2003, в Microsoft Visual C++ не используются старые библиотеки iostream.
7.13 Динамически подключаемые библиотеки (DLL)
Динамически подключаемые библиотеки (DLL) позволяют различным программам совместно использовать хранящиеся в них ресурсы в процессе выполнения. DLL аналогичны модулям, но существуют следующие различия:
-DLL могут экспортировать в качестве ресурсов в другие DLL и программы только функции;
-DLL подключаются не статически, а динамически;
-DLL могут создаваться только для защищенного режима MS DOS или Windows.
В теле динамической библиотеки могут быть объявлены типы, константы, переменные, функции, объекты и другие элементы, но экспортировать она может только функции. В отличие от статического модуля динамическая библиотека подключается к программе только во время ее выполнения. Windows загружает DLL-библиотеки отдельно от кода программ, поэтому несколько приложений могут совместно использовать одну и ту же библиотеку. Динамические библиотеки загружаются в память при необходимости и могут выгружаться из нее, освобождая ресурсы.
По структуре текст DLL похож на программы, за исключением:
1) главная функция не main (или WinMain), а DllEntryPoint, которая в среде C++Builder 6.0 объявляется с помощью пункта File/New/Wizard DLL и имеет вид
#include <windows.h> #pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{// здесь помещается текст return 1; // Код возращения
}//---------------------------------------------------------------------------
2)в конце функции DllEntryPoint возвращается код успешной работы не 0 (как
вmain), а 1;
3)экспортируемые из библиотеки функции объявляются в следующем формате: extern “C” __declspec(dllexport) тип_результата имя(список параметров)
Директива extern "С" означает, что к подпрограмме можно будет обратиться из
приложения, написанного на другом языке программирования.
Директива __declspec с параметром dllexport определяет функцию как экспортируемую из DLL-библиотеки (предназначенную для вызова из внешних программ).
Экспортируемая функция в DLL-библиотеке идентифицируется двумя уникальными ключами: числовым индексом (положительное целое число от 1 до 32767) и именем.
Среда C++Builder позволяет экспортировать функции двумя способами — с использованием директивы declspec и с использованием файла описания модуля. Файл описания модуля представляет собой текстовый файл с расширением DEF. Для 32разрядных приложений файл описания модуля необязателен.
Внутри функции DllEntryPoint выполняются любые действия, связанные с инициализацией или завершением использования библиотеки. Функция будет выполнена при загрузке DLL-библиотеки в оперативную память или выгрузке ее из оперативной памяти. Созданная DLL не требует инициализации, поэтому функция DllEntryPoint пуста.
Пример формирования в C++Builder 6.0 DLL-модуля с двумя функциями: Min (вычисления минимального из двух целых чисел) и Мах (вычисления максимального из двух целых чисел).
#include <windows.h> #pragma argsused
extern "C" __declspec (dllexport) int Max (int X, int Y) { return (X > Y) ? X : Y;
} // конец Max -----------------------------------------------------
extern "C" __declspec (dllexport) int Min (int X, int Y) { return (X < Y) ? X : Y;
}// конец Min -------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; }//---------------------------------------------------------------------------
30
При формировании DLL-модуля в среде C++Builder форміруется 2 файла: cpp-файл собственно модуля и файл проекта, имя которого будет совпадать с именем dll-файла. Компоновка dll-файла в среде C++Builder 6.0 производится с помощью пункта меню
Project/Build ProjectDLL.
Для доступа к функциям DLL в прикладной программе, их необходимо подключить, или импортировать. Импорт функций из DLL может осуществляться двумя способами:
1)с помощью директивы __declspec(dllimport) - статический импорт;
2)с помощью функций LoadLibrary и GetProcAddress - динамический импорт. При статическом импорте в программу помещаются объявления импортируемых
функций DLL с директивой declspec(dllimport). Пример подключения функций Max и Min extern "С" __declspec(dllimport) int Min(int, int);
extern "C"__declspec(dllimport) int Max(int, int);
Для подключения к программе DLL-библиотеки необходимо выполнить следующее: 1) создать библиотеку импорта из DLL-файла (статическая LIB-библиотека, содержащая имя соответствующего DLL-модуля и ссылки на экспортируемые им функции) в C++Builder 6.0 создается автоматически при выполнении Project/Build ProjectDLL ес-
ли в окне настройке опций проекта (Project/Options) на странице Linker установлен маркер в позиции Generate import library;
|
Рисунок |
7.3 |
– Окно опций проекта на странице Linker |
|
|
2) добавить |
полученную библиотеку |
в проект (Project/Add to Project...) В по- |
|
явившемся диалоговом окне нужно выбрать |
из выпадающего списка тип файлов lib и за- |
|||
тем |
указать нужный lib-файл. После этого функции из DLL можно использовать так, |
|||
как |
будто они |
являются частью самой программы. |