Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

7 Структурное программирование 2012

.pdf
Скачиваний:
12
Добавлен:
29.02.2016
Размер:
310.72 Кб
Скачать

 

 

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 можно использовать так,

как

будто они

являются частью самой программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]