Книга по работе с WinAVR и AVR Studio / AVR_10-2010
.pdf
СПРАВОЧНЫЙ МАТЕРИАЛ
|
Роман Абраш |
Книга по работе |
||||||
|
|
|
|
|
||||
|
г. Новочеркасск |
с WinAVR и AVR Studio |
||||||
|
E-mail: arv@radioliga.com |
|||||||
|
|
|
|
|
alloca.h – Выделение памяти |
|
Классифицирующие функции следую- |
|
|
Продолжение. |
|
|
|||||
|
|
в стеке |
|
щие: |
||||
|
Начало в №1-9/2010 |
|
|
|||||
|
|
Определение: |
|
isalnum() |
||||
|
|
|
|
|
void * alloca(size_t size); |
|
isalpha() |
|
AVR-LIBC |
Описание: функция выделяет size |
|
isascii() |
|||||
|
|
|
|
|
байт в области стека вызывающего мо- |
|
isblank() |
|
ВВЕДЕНИЕ |
дуля. Это временно выделяемое про- |
|
iscntrl() |
|||||
Комплект WinAVR содержит много раз- |
странство автоматически освобождается, |
|
isdigit() |
|||||
личных средств для разработки программ- |
когда функция, вызывающая alloca(), воз- |
|
isgraph() |
|||||
ного обеспечения микроконтроллерных си- |
вращает управление в вызывающую ее |
|
islower() |
|||||
стем на основе микроконтроллеров AVR. |
функцию. alloca() реализована в виде мак- |
|
isprint() |
|||||
Однако, сам по себе компилятор, каким бы |
роса, который транслируется в inline-фун- |
|
ispunct() |
|||||
хорошим и универсальным он ни был, не |
кцию __builtin_alloca(). Это означает, что |
|
isspace() |
|||||
содержит главного: набора библиотечных |
нет возможности обращаться к функции по |
|
isupper() |
|||||
функций. Существует некий набор библио- |
ее адресу или изменять ее поведение при |
|
isxdigit() |
|||||
течных функций, ставший стандартным, т.е. |
связывании с другими библиотеками. |
|
Эти функции получают в качестве па- |
|||||
набор, к которому привыкли все без исклю- |
Возвращаемое значение: функция |
|
раметра символ, и возвращают истин- |
|||||
чения программисты Си, его так и называ- |
возвращает указатель на начало выделен- |
|
ное или ложное значение в зависимос- |
|||||
ют стандартной библиотекой. |
ной области. Если происходит переполне- |
|
ти от того, как этот символ прокласси- |
|||||
Очевидно, для полноценной разработ- |
ние стека, поведение программы не опре- |
|
фицирован. Если параметр не является |
|||||
ки ПО для микроконтроллеров AVR так же |
делено. |
|
unsigned char – все функции возвращают |
|||||
необходима такая стандартная библиотека. |
Предупреждение: избегайте использо- |
|
FALSE. |
|||||
И она включена в состав WinAVR: это биб- |
вания функции внутри списка параметров |
|
Преобразующие функции следую- |
|||||
лиотека AVR-LIBC. Она представляет собой |
функций. |
|
щие: |
|||||
набор объектных модулей и соответствую- |
assert.h – Диагностика |
|
toascii() |
|||||
щих заголовочных файлов, обеспечивает |
|
tolower() |
||||||
большинство традиционно-стандартных |
Определение: |
|
toupper() |
|||||
функций, а так же ряд платформо-ориенти- |
#include <assert.h> |
|
Эти функции так же получают в каче- |
|||||
рованных расширений, т.е. функций, специ- |
Описание: этот заголовочный файл |
|
стве параметра символ, а возвращают уже |
|||||
фичных только для микроконтроллеров |
определяет вспомогательные отладочные |
|
преобразованный символ. |
|||||
AVR. Стандартные функции порой имеют от- |
возможности. |
|
|
|
||||
клонения от привычного поведения в «ком- |
Так как в большинстве приложений нет |
|
Функции модуля |
|||||
пьютерном Си», что связано с ограничени- |
стандартно заданного потока вывода для |
|
Обратите внимание на то, что параметр |
|||||
ями, накладываемыми архитектурой мик- |
ошибок,генерированиепечатаемыхсообще- |
|
этих функций имеет тип int, хотя использу- |
|||||
роконтроллера. Программист должен быть |
ний об ошибках по умолчанию отключено. |
|
ется как символ, т.е. char. |
|||||
осведомлен о таких отклонениях. |
Эти сообщения будут генерироваться толь- |
|
|
|
||||
Далее будут рассмотрены основные |
ко в том случае, если в приложении опре- |
|
isalnum() |
|||||
составляющие части библиотеки AVR-LIBC |
делен макрос __ASSERT_USE_STDERR |
|
||||||
|
Определение: |
|||||||
с необходимыми комментариями. Они раз- |
прежде подключения файла <assert.h>. По |
|
||||||
|
int isalnum (int c) |
|||||||
делены на три группы: Стандартные моду- |
умолчанию для остановки приложения дол- |
|
Описание: Проверяет, является ли ар- |
|||||
ли, AVR-специфичные модули и Вспомога- |
жна использоваться только функция abort(). |
|
||||||
|
гумент алфавитно-цифровым символом. |
|||||||
тельные модули. |
Применение: |
|
||||||
|
Результат эквивалентен (isalpha(с) || |
|||||||
|
|
|
|
|
#define assert(<выражение>) |
|
||
|
|
|
|
|
|
isdigit(c)) |
||
СТАНДАРТНЫЕ МОДУЛИ |
Макрос assert() принимает в качестве |
|
||||||
|
|
|
||||||
Стандартные модули – это модули, ре- |
параметра выражение, проверяет его на |
|
isalpha() |
|||||
ализующие набор привычных функций, ха- |
истинность и, если выражение ложно, вы- |
|
||||||
|
Определение: |
|||||||
рактерных для всех Си-программ вне зави- |
зывает функцию abort() для завершения |
|
||||||
|
int isalpha (int c) |
|||||||
симости от платформы. В этот раздел вклю- |
приложения. При этом в стандартный по- |
|
||||||
|
Описание: Проверяет, является ли сим- |
|||||||
чен и ряд модулей, определяющих некото- |
ток вывода ошибок выводится соответ- |
|
||||||
|
вол алфавитным. Результат эквивалентен |
|||||||
рые важные для GCC-компилятора констан- |
ствующее сообщение. Если выражение |
|
||||||
|
(isupper(c) || islower(c)) |
|||||||
ты, а так же модули, необходимые для всех |
истинно, этот макрос не выполняет ника- |
|
||||||
|
|
|
||||||
прочих библиотечных модулей AVR-LIBC. |
ких действий. |
|
isascii() |
|||||
Далее будет принят следующий фор- |
Все макросы assert() могут быть уда- |
|
||||||
|
Определение: |
|||||||
мат изложения материала: |
лены из текста программы при компиляции |
|
||||||
|
int isascii (int c) |
|||||||
- жирным шрифтом выделяется |
с параметром –DNDEBUG. |
|
||||||
|
Описание: Проверяет, является ли па- |
|||||||
наименование раздела, как правило, со- |
|
|
||||||
|
|
раметр 7-битным ASCII-символом. |
||||||
впадающего с соответствующим моду- |
ctype.h – Символьные операции |
|
||||||
|
|
|
||||||
лем библиотеки; |
Тут определены различные функции |
|
isblank() |
|||||
- подчеркнутым шрифтом выделя- |
над символами. |
|
||||||
|
Определение: |
|||||||
ется функция или макрос, опреджеляе- |
Определение: |
|
||||||
|
int isblank (int c) |
|||||||
мый в рассматриваемом модуле; |
#include <ctype.h> |
|
Описание: Проверяет, является ли сим- |
|||||
- после слова Определение приво- |
Описание: этот заголовочный файл |
|
||||||
|
вол «пустым», т.е. является ли он пробелом |
|||||||
дится прототип функции, как он опреде- |
подключает к проекту некоторые функции |
|
или символом табуляции. |
|||||
лен в соответствущем хидере. |
(см. далее детальное описание каждой) об- |
|
||||||
|
|
|
||||||
Далее следует подробное описание |
работки символов. Функции разделены на |
|
iscntrl() |
|||||
функции или макроса, иногда с поясне- |
две группы: классифицирующие символ и |
|
||||||
|
Определение: |
|||||||
ниями. |
преобразующие символ. |
|
||||||
|
int iscntrl (int c) |
|||||||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
5 7 |
Радиолюбитель – 10/2010 |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
||
СПРАВОЧНЫЙ МАТЕРИАЛ
Описание: Проверяет, является ли сим- |
преобразует в непредсказуемые, делая |
Дальние указатели для адресации бо- |
||
вол управляющим. |
текст нечитаемым. |
лее, чем 64К памяти |
|
|
|
|
|
typedef int32_t int_farptr_t – целое со |
|
isdigit() |
tolower() |
знаком для хранения дальнего указателя. |
||
Определение: |
Определение: |
typedef uint32_t uint_farptr_t – целое |
||
int isdigit (int c) |
int tolower (int c) |
беззнаковое для хранения дальнего указа- |
||
Описание: Проверяет, является ли сим- |
Описание: Преобразует, если возмож- |
теля. |
|
|
вол цифровым. |
но, регистр символа к нижнему. |
|
|
|
|
|
|
Макросы для спецификатора форма- |
|
isgraph() |
toupper() |
тов printf() и scanf() |
|
|
Определение: |
Определение: |
Для С++ эти макросы подключаются |
||
int isgraph (int c) |
int toupper (int c) |
только в том случае, если определен сим- |
||
Описание: Проверяет, является ли сим- |
Описание: Преобразует, если возмож- |
вол __STDC_LIMIT_MACROS до подключе- |
||
вол «псевдографическим». |
но, регистр символа к верхнему. |
ния файла <inttypes.h>. |
|
|
|
|
|
Модуль содержит большое количество |
|
islower() |
errno.h – Системные ошибки |
макросов для определения форматов вво- |
||
Определение: |
Определение: |
да-вывода различных чисел. Т.к. эти мак- |
||
int islower (int c) |
#include <errno.h> |
росы применяются в основном встроенны- |
||
Описание: Проверяет, является ли «ре- |
Описание: многие библиотечные фун- |
ми в библиотеку функциями, практическая |
||
гистр» символа «нижним». |
кции при возникновении ошибок устанав- |
их ценность для конечного пользователя |
||
|
ливают значение встроенной глобальной |
невелика. Поэтому из рассмотрения в дан- |
||
isprint() |
переменной errno. Подключение заголовоч- |
ном издании они опущены. |
|
|
Определение: |
ного файла errno.h вводит этим значениям |
math.h – Математика |
|
|
int isprint (int c) |
символьные эквиваленты. |
|
||
Описание: Проверяет, является ли сим- |
Предупреждение: использование гло- |
Определение: |
|
|
вол «печатаемым», т.е. любым, который |
бальной переменной errno в мультизадач- |
#include <math.h> |
|
|
можно отобразить на печатающем устрой- |
ных или многопоточных приложениях не |
Описание: этот заголовочный файл |
||
стве (включая пробел). |
является удачным. Проблема в том, что ее |
определяет некоторые базовые константы |
||
|
значение может быть изменено другим по- |
и математические операции. |
|
|
ispunct() |
током в промежутке между ее установкой и |
Функции, определенные этим файлом, |
||
Определение: |
началом анализа в исходном потоке. |
требуют связывания с libm.a. Так же сле- |
||
int ispunct (int c) |
Примечание. Символьные константы, |
дует учитывать, что математические фун- |
||
Описание: Проверяет, является ли сим- |
описанные в этом файле, не имеют практи- |
кции не генерируют исключений и не из- |
||
вол печатаемым, но при этом не принадле- |
ческой ценности для начинающего разра- |
меняют переменную errno. Для улучшения |
||
жит алфавитно-цифровым или «пустым». |
ботчика, поэтому не приводятся – вы може- |
качества оптимизации GCC они реализо- |
||
|
те самостоятельно изучить их по содержи- |
ваны в большинстве своем с атрибутом |
||
isspace() |
мому указанного файла. |
const. |
|
|
Определение: |
|
|
|
|
int isspace (int c) |
inttypes.h – Целочисленные |
Определения модуля |
|
|
Описание: Проверяет, является ли |
преобразования |
#define |
M_PI |
|
символ символом-разделителем. В этой ре- |
Определение: |
3.141592653589793238462643 – число p |
||
ализации AVR-LIBC в число этих символов |
#include <inttypes.h> |
#define |
M_SQRT2 |
|
входят: |
Описание: этот заголовочный файл |
1.4142135623730950488016887 – квадрат- |
||
- пробел |
использует определения целых чисел |
ный корень из двух |
|
|
- пролистывание формы (form-feed, “\f”) |
stdint.h и расширяет их дополнительными |
#define NAN __builtin_nan(«») – кон- |
||
- перевод строки (“\n”) |
вариантами, используемыми в работе ком- |
станта определения «не числа» |
||
- возврат каретки (“\r”) |
пилятора. |
#define INFINITY __builtin_inf() – кон- |
||
- горизонтальная табуляция (“\t”) |
В настоящее время расширения вклю- |
станта определения бесконечно большого |
||
- вертикальная табуляция (“\v”) |
чают 2 дополнительных целочисленных |
значения |
|
|
|
типа для «дальних указателей» (т.е. для |
|
|
|
isupper() |
указателей в коде, способных адресовать |
Функции модуля |
|
|
Определение: |
память более чем 64К), а так же все типы, |
cos() |
|
|
int isupper (int c) |
поддерживаемые функциями форматиро- |
Определение: |
|
|
Описание: Проверяет, является ли сим- |
ванного вывода из stdio.h. Так как эти фун- |
double cos (double x) |
|
|
вол буквой в верхнем регистре. |
кции не реализуют полного комплекта спе- |
Описание: возвращает косинус аргу- |
||
|
цификаций, определяемых ISO 9899:1999, |
мента x (должен быть в радианах). |
||
isxdigit() |
включены только реализованные возмож- |
|
|
|
Определение: |
ности. |
fabs() |
|
|
int isxdigit (int c) |
Идея подхода в том, что каждый тип, |
Определение: |
|
|
Описание: Проверяет, является ли сим- |
определенный в stdint.h, сопровождает- |
double fabs (double x) |
|
|
волдопустимойшестнадцатеричнойцифрой. |
ся макросами, позволяющими опреде- |
Описание: возвращает модуль значе- |
||
|
лить соответствующий объект формати- |
ния аргумента x. |
|
|
toascii() |
рования для функций printf() или scanf(). |
|
|
|
Определение: |
Пример: |
fmod() |
|
|
int toascii (int c) |
|
|
Определение: |
|
#include <inttypes.h> |
|
|
||
Описание: Преобразует символ в 7-бит- |
|
double fmod (double x, double y) |
||
uint8_t smallval; |
|
|||
ный ASCII-символ путем очистки старших |
|
Описание: возвращает остаток от де- |
||
int32_t longval; |
|
|||
битов. |
|
ления x/y. |
|
|
Предупреждение: пользователи могут |
... |
|
|
|
быть недовольны, если вы применяете эту |
printf(«The hexadecimal value of smallval is |
|
modf() |
|
«PRIx8», the decimal value of longval is |
|
|
||
функцию, т.к. многие символы (например, |
|
Определение: |
|
|
«PRId32 «.\n», smallval, longval); |
|
|
||
национальных алфавитов) эта функция |
|
double modf (double x, double *iptr) |
||
5 8 |
Радиолюбитель – 10/2010 |
|
СПРАВОЧНЫЙ МАТЕРИАЛ
|
Описание: функция разбивает аргу- |
cosh() |
Описание: возвращает 1, если аргу- |
||||||
мент x на целую и дробную части, каждая |
Определение: |
мент x бесконечно малое значение, и 0 – в |
|||||||
из которых имеет тот же знак, что и x. Фун- |
double cosh (double x) |
противном случае. |
|||||||
кция возвращает дробную часть (со зна- |
Описание: возвращает гиперболичес- |
|
|
||||||
ком), а целую часть (со знаком) помещает |
кий косинус аргумента x. |
isinf() |
|||||||
по указателю iptr. |
|
Определение: |
|||||||
|
Примечание: если указатель iptr нуле- |
sinh() |
int isinf (double x) |
||||||
вой – возврат целой части пропускается. |
Определение: |
Описание: возвращает -1, если аргу- |
|||||||
|
|
|
|
|
|
|
double sinh (double x) |
мент x – «минус-бесконечность», 1, если |
|
|
sin() |
Описание: возвращает гиперболичес- |
аргумент «плюс-бесконечность» и 0 – в |
||||||
|
Определение: |
кий синус аргумента x. |
противном случае. |
||||||
|
double sin (double x) |
|
|
|
|||||
|
Описание: возвращает синус аргумен- |
tanh() |
square() |
||||||
та x (должен быть в радианах). |
Определение: |
Определение: |
|||||||
|
|
|
|
|
|
|
double tanh (double x) |
double square (double x) |
|
|
sqrt() |
Описание: возвращает гиперболичес- |
Описание: возвращает x в квадрате. |
||||||
|
|
|
|
|
|
|
|||
|
Определение: |
кий тангенс аргумента x. |
Примечание: это нестандартная для С |
||||||
|
double sqrt (double x) |
|
функция. |
||||||
|
Описание: возвращает не отрицатель- |
acos() |
|
|
|||||
ный квадратный корень аргумента x. |
Определение: |
copysign() |
|||||||
|
|
|
|
|
|
|
double acos (double x) |
Определение: |
|
|
tan() |
Описание: возвращает арккосинус |
static double copysign (double x, double y) |
||||||
|
Определение: |
аргумента x. Значение аргумента должно |
Описание: возвращает x, но со знаком |
||||||
|
double tan (double x) |
быть в пределах допустимых значений |
от y. Эта функция работает даже если лю- |
||||||
|
Описание: возвращает тангенс аргу- |
-1…+1. Возвращается значение в пределах |
бой из аргументов (или оба) – бесконечность |
||||||
мента x (должен быть в радианах). |
-p/2…+p/2 радиан. |
или пренебрежимо малые числа. |
|||||||
|
floor() |
asin() |
fdim() |
||||||
|
Определение: |
Определение: |
Определение: |
||||||
|
double floor (double x) |
double asin (double x) |
double fdim (double x, double y) |
||||||
|
Описание: возвращает в виде числа с |
Описание: возвращает арксинус ар- |
Описание: возвращает наибольшее |
||||||
плавающей точкой ближайшее целое чис- |
гумента x. Значение аргумента должно |
значение из вариантов (x-y) или 0. Если хотя |
|||||||
ло, меньшее или равное аргументу x. |
быть в пределах допустимых значений |
бы одно из чисел бесконечно мало – воз- |
|||||||
|
|
|
|
|
|
|
-1…+1. Возвращается значение в пределах |
вращается бесконечно малое число. |
|
|
ceil() |
-p/2…+p/2 радиан. |
|
|
|||||
|
Определение: |
|
fma() |
||||||
|
double ceil (double x) |
atan() |
Определение: |
||||||
|
Описание: возвращает в виде числа с |
Определение: |
double fma (double x, double y, double z) |
||||||
плавающей точкой ближайшее целое чис- |
double atan (double x) |
Описание: функция «умножение с на- |
|||||||
ло, большее или равное аргументу x. |
Описание: возвращает арктангенс ар- |
коплением». Возвращает (x*y)+z, одна- |
|||||||
|
|
|
|
|
|
|
гумента x. Возвращается значение в пре- |
ко, в процессе вычислений промежуточ- |
|
|
frexp() |
делах -p/2…+p/2 радиан. |
ный результат не округляется, что позво- |
||||||
|
|
|
|
|
|
|
|||
|
Определение: |
|
ляет порой улучшить точность вычисле- |
||||||
|
double frexp (double x, int *pexp) |
atan2() |
ний. |
||||||
|
Описание: функция разбивает число x |
Определение: |
|
|
|||||
на два множителя: первый множитель – это |
double atan2 (double y, double x) |
fmax() |
|||||||
число 0 или число в диапазоне (по модулю) |
Описание: возвращает арктангенс ча- |
Определение: |
|||||||
от 0,5 до 1, – функция возвращает в каче- |
стного x/y. Возвращается значение в пре- |
double fmax (double x, double y) |
|||||||
стве результата; второй множитель образу- |
делах -p…+p радиан. |
Описание: возвращает наибольший из |
|||||||
ется как число 2 в степени pexp. Таким об- |
|
аргументов. Если оба аргумента NAN - воз- |
|||||||
разом, если результат функции обозначить |
log() |
вращается NAN, если один аргумент NAN, |
|||||||
y, то x = y * 2pexp. |
Определение: |
возвращается другой. |
|||||||
|
Если x равно нулю – обе возвращае- |
double log (double x) |
|
|
|||||
мые части равны нулю. Если x не является |
Описание: возвращает натуральный |
fmin() |
|||||||
конечным числом – функция возвращает x, |
логарифм аргумента x. |
Определение: |
|||||||
а pexp равно нулю. |
|
double fmin (double x, double y) |
|||||||
|
Если второй параметр функции NULL, |
log10() |
Описание: возвращает наименьший из |
||||||
то функция воспринимает это как указание |
Определение: |
аргументов. Если оба аргумента NAN - воз- |
|||||||
не вычислять и не возвращать значение |
double log10 (double x) |
вращается NAN, если один аргумент NAN, |
|||||||
pexp. |
Описание: возвращает десятичный |
возвращается другой. |
|||||||
|
|
|
|
|
|
|
логарифм аргумента x. |
|
|
|
ldexp() |
|
signbit() |
||||||
|
|
|
|
|
|
||||
|
Определение: |
pow() |
Определение: |
||||||
|
double ldexp (double x, int exp) |
Определение: |
int signbit (double x) |
||||||
|
Описание: возвращает число x, умно- |
double pow (double x, double y) |
Описание: возвращает 1, если знако- |
||||||
женное на 2 в степени exp. |
Описание: возвращает x, возведенное |
вый бит у аргумента x установлен. |
|||||||
|
|
|
|
|
|
|
в степень y. |
Примечание: это не то же самое, что |
|
|
exp() |
|
результат (x < 0.0), так как спецификация |
||||||
|
|
|
|
|
|||||
|
Определение: |
isnan() |
IEEE 754 допускает наличие знака у нуля! |
||||||
|
double exp (double x) |
Определение: |
Значение (-0.0 < 0.0) ложно, но signbit(-0.0) |
||||||
|
Описание: возвращает е в степени x |
int isnan (double x) |
возвратит ненулевое значение! |
||||||
(экспоненциальная функция). |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
5 9 |
Радиолюбитель – 10/2010 |
|
|
|
|
|||||
|
|
|
|
|
|||||
СПРАВОЧНЫЙ МАТЕРИАЛ
trunс() |
Врезка. Пример использования функций. |
||
Определение: |
|||
|
|
||
double trunc (double x) |
#include <setjmp.h> |
|
|
Описание: возвращает округленное до |
|
||
ближайшего целого, не большего по моду- |
jmp_buf env; // env – переменная-метка |
|
|
лю аргумента x, число. |
int main (void){ |
|
|
isfinite() |
if (setjmp (env)){ |
|
|
... здесь должна обработаться ошибка ... |
|||
Определение: |
} |
|
|
static int isfinite (double x) |
while (1){ |
|
|
Описание: возвращает ненулевое зна- |
|
||
чение, если аргумент x – конечное число: |
... основной цикл, в котором вызывается foo() ... |
||
не бесконечность (с любым знаком) и не |
} |
|
|
NAN. |
} |
|
|
|
... |
|
|
hypot() |
void foo (void){ |
|
|
Определение: |
... что-то делается ... |
|
|
double hypot (double x, double y) |
if (err){ |
|
|
Описание: возвращает квадратный |
// а если происходит ошибка – происходит переход в главную функцию longjmp (env, 1); |
||
корень из суммы квадратов аргументов. |
} |
|
|
Применение этой функции вместо ее экви- |
} |
|
|
валента sqrt(x*x + y*y) более предпочтитель- |
|
|
|
|
|
||
но, так как обеспечивает лучшую точность. |
|
|
|
Исключается ошибка промежуточного ок- |
Использование этих подходов может |
Примечаниe от автора |
|
ругления, ошибки переполнения (при боль- |
сделать программу сложной для понима- |
Не смотря на некоторую гибкость воз- |
|
ших значениях аргументов) и «исчезнове- |
ния, а так же может привести к потере кон- |
можностей, предлагаемых функциями |
|
ния» (при малых значениях) результата. |
текста глобальных регистровых перемен- |
модуля setjmp.h, настоятельно не реко- |
|
|
ных. Поэтому по возможности следует ис- |
мендуется применять их, особенно в слу- |
|
round() |
кать альтернативные пути. |
чае, когда общая квалификация програм- |
|
Определение: |
Пример использования функций см. |
миста невысока (т.е. начинающими). |
|
double round (double x) |
на врезке: |
|
|
Описание: возвращает округленное до |
|
stdint.h – Стандартные |
|
ближайшего целого значение аргумента x, |
Функции модуля |
целые числа |
|
но при этом не учитывает правило «полови- |
|
Модуль вводит описания различных |
|
ны единицы». Переполнение не возникает. |
setjmp() |
типов целых чисел, определяемых стан- |
|
Примечание: если аргумент – целое |
Определение: |
дартом С99. Просто используйте для оп- |
|
число или бесконечность – оно и возвра- |
int setjmp (jmp_buf jmpb) |
ределения переменных разрядностью N |
|
щается. Если аргумент NAN – возвращает- |
Параметры: |
бит (где N может быть 8, 16, 32 или 64) |
|
ся NAN. |
jmp_buf jmpb – переменная сохранения |
следующую форму записи типа: |
|
|
контекста. |
[u]intN_t. Например, uint8_t – эквива- |
|
lround() |
Описание: функция сохраняет кон- |
лент unsigned char; а int16_t – эквива- |
|
Определение: |
текст стека и «окружения» в переменной |
лент signed int. |
|
long lround (double x) |
jmpb для последующего использования |
Кроме того, вводится большое количе- |
|
Описание: возвращает целое число. В |
в функции longjmp(). Сохраненный кон- |
ство макросов и констант, которые можно |
|
остальном аналогична round(), кроме того, |
текст теряется, если происходит возврат |
использовать в своих программах. |
|
что ошибка переполнения возможна. |
из функции, использовавшей setjmp(). |
|
|
|
Функция возвращает 0, если возврат |
Типы целых чисел |
|
lrint() |
произошел немедленно, и не 0, если воз- |
Следующие типы вводят (определяют) |
|
Определение: |
врат произошел при вызове longjmp() с ис- |
обозначения-синонимы типам целых чисел |
|
long lrint (double x) |
пользованием сохраненного контекста. |
по размеру в битах. Любой из этих типов |
|
Описание: возвращает округленное до |
|
может быть представлен стандартным эк- |
|
целого значение аргумента х с учетом «пра- |
longjmp() |
вивалентом, однако вводимые типы имеют |
|
вила половины», т.е. 1,5 и 2,5 будут округ- |
Определение: |
более короткую запись, что, несомненно, |
|
лены до 2. |
void longjmp (jmp_buf jmpb, int ret) |
более удобно: |
|
Примечание: возвращаемое значение |
__ATTR_NORETURN__ |
int8_t – байт со знаком (8 бит) |
|
может быть LONG_MIN (т.е. 0x80000000), |
Параметры: |
uint8_t – байт без знака (8 бит) |
|
если аргумент – не конечное число или было |
jmp_buf jmpb – переменная сохранения |
int16_t – целое число со знаком (16 бит) |
|
переполнение. |
контекста. |
uint16_t – целое число без знака (16 бит) |
|
setjmp.h – Нелокальные |
int ret – значение, используемое для |
int32_t – длинное целое число со зна- |
|
возврата. |
ком (32 бита) |
||
переходы goto |
Описание: функция осуществляет не- |
uint32_t – длинное целое число без зна- |
|
Подробное описание |
локальный переход к сохраненному ранее |
ка (32 бита) |
|
Когда в тексте программы применяет- |
контексту. Возврата из функции в традици- |
int64_t – большое длинное число со зна- |
|
ся оператор goto, он позволяет осуществить |
онном понимании нет, нет и возвращаемо- |
ком (64 бита) |
|
переход только внутри функции, где он при- |
го значения. |
uint64_t – большое длинное число без |
|
менен (т.е. локально). Чтобы осуществить |
Функция восстанавливает окружение |
знака (64 бита) |
|
переход в произвольное место программы, |
(т.е. состояние среды) в том виде, как со- |
|
|
определены функции setjmp() и longjmp(). Их |
хранено ранее в переменной jmpb, после |
Вводятся 2 типа для указателей: |
|
использование позволяет, например, реа- |
чего осуществляет передачу управления |
intptr_t – то же самое, что и int16_t, ис- |
|
лизовать более эффективно обработку |
так, как будто завершилась функция |
пользуется для хранения указателя |
|
ошибок и исключительных ситуаций при |
setjmp() в том месте, откуда была вызвана, |
uintptr_t – то же самое. Что и uint16_t, |
|
низкоуровневом программировании. |
но с возвратом значения ret. |
используется для хранения указателя |
|
6 0 |
Радиолюбитель – 10/2010 |
|
СПРАВОЧНЫЙ МАТЕРИАЛ
|
Ряд типов для чисел, содержащих |
|
INT8_MIN – минимальное число типа |
|
INTPTR_MAX |
|
|
числа с числом битов не менее опреде- |
|
int8_t |
|
INTPTR_MIN |
|
||
ленного: |
|
UINT8_MAX – максимальное число типа |
|
UINTPTR_MAX |
|
||
|
int_least8_t – для чисел со знаком не |
|
uint8_t |
|
INTMAX_MAX |
|
|
более чем из 8 битов |
|
INT16_MAX – максимальное число типа |
|
INTMAX_MIN |
|
||
|
uint_least8_t – для чисел без знака не |
|
int16_t |
|
UINTMAX_MAX |
|
|
более чем из 8 битов |
|
INT16_MIN – минимальное число типа |
|
|
|
||
|
int_least16_t – для чисел со знаком не |
|
int16_t |
|
Имеется так же ряд констант макси- |
||
более чем из 16 бит |
|
UINT16_MAX – максимальное число |
|
мальных значений для специальных типов |
|||
|
uint_least16_t – для чисел без знака не |
|
типа uint16_t |
|
(эти определения для С++ так же требуют |
||
более чем из 16 бит |
|
INT32_MAX – максимальное число типа |
|
наличия |
определения |
||
|
int_least32_t – для чисел со знаком не |
|
int32_t |
|
__STDC_LIMIT_MACROS до подключения |
||
более чем из 32 битов |
|
INT32_MIN – минимальное число типа |
|
модуля stdint.h): |
|
||
|
uint_least32_t – для чисел без знака не |
|
int32_t |
|
PTRDIFF_MAX |
|
|
более чем из 32 битов |
|
UINT32_MAX – максимальное число |
|
PTRDIFF_MIN |
|
||
|
int_least64_t – для чисел со знаком не |
|
типа uint32_t |
|
SIG_ATOMIC_MAX |
|
|
более чем из 64 битов |
|
INT64_MAX – максимальное число типа |
|
SIG_ATOMIC_MIN |
|
||
|
uint_least64_t – для чисел без знака не |
|
int64_t |
|
SIZE_MAX |
|
|
более чем из 64 битов |
|
INT64_MIN – минимальное число типа |
|
|
|
||
|
Определения типов для чисел заданной |
|
int64_t |
|
Макросы задания числовых констант |
||
размерности. Обрабатывающихся с макси- |
|
UINT64_MAX – максимальное число |
|
Модуль определяет ряд макросов-фун- |
|||
мальной скоростью31 (расшифровка типов |
|
типа uint64_t |
|
кций, позволяющих определять числовые |
|||
не приводится ввиду явной очевидности): |
|
|
|
|
константы заданного размера без исполь- |
||
|
int_fast8_t |
|
Аналогичные константы предельных |
|
зования «суффиксов» размерности: |
||
|
uint_fast8_t |
|
значений определены и для всех других ти- |
|
INT8_C(value) – константа 8-битная со |
||
|
int_fast16_t |
|
пов чисел (приводятся без описания): |
|
знаком |
|
|
|
uint_fast16_t |
|
INT_LEAST8_MAX |
|
UINT8_C(value) – константа 8-битная без |
||
|
uint_fast32_t |
|
INT_LEAST8_MIN |
|
знака |
|
|
|
int_fast64_t |
|
UINT_LEAST8_MAX |
|
INT16_C(value) – константа 16-битная со |
||
|
uint_fast32_t |
|
INT_LEAST16_MAX |
|
знаком |
|
|
|
|
|
INT_LEAST16_MIN |
|
UINT16_C(value) – константа 16-битная |
||
|
Определения типов целых чисел, спо- |
|
UINT_LEAST16_MAX |
|
без знака |
|
|
собных хранить максимально возможные |
|
INT_LEAST32_MAX |
|
INT32_C(value) – константа 32-битная со |
|||
числа среди поддерживаемых знаковых или |
|
INT_LEAST32_MIN |
|
знаком |
|
||
беззнаковых: |
|
UINT_LEAST32_MAX |
|
UINT32_C(value) – константа 32-битная |
|||
|
intmax_t – наибольшее целое со знаком |
|
INT_LEAST64_MAX |
|
без знака |
|
|
(аналог int64_t) |
|
INT_LEAST64_MIN |
|
INT64_C(value) – константа 64-битная со |
|||
|
uintmax_t – наибольшее целое без зна- |
|
UINT_LEAST64_MAX |
|
знаком |
|
|
ка (аналог uint64_t) |
|
INT_FAST8_MAX |
|
UINT64_C(value) – константа 64-битная |
|||
|
|
|
INT_FAST8_MIN |
|
без знака |
|
|
|
Константы |
|
UINT_FAST8_MAX |
|
INTMAX_C(value) – константа наиболь- |
||
|
В модуле определен ряд констант (мак- |
|
INT_FAST16_MAX |
|
шего размера со знаком |
|
|
росов), определяющих предельные значе- |
|
INT_FAST16_MIN |
|
UINTMAX_C(value) – константа наиболь- |
|||
ния для чисел каждого типа. Данные кон- |
|
UINT_FAST16_MAX |
|
шего размера без знака |
|
||
станты для программ на С++ подключают- |
|
INT_FAST32_MAX |
|
Использование этих макросов вместо |
|||
ся только в том случае, если определено |
|
INT_FAST32_MIN |
|
простых чисел позволит избежать ошибок, |
|||
__STDC_LIMIT_MACROS до подключения |
|
UINT_FAST32_MAX |
|
связанных с определением размерности |
|||
модуля stdint.h. |
|
INT_FAST64_MAX |
|
результата вычислений с константами. |
|||
|
INT8_MAX – максимальное число типа |
|
INT_FAST64_MIN |
|
|
|
|
int8_t |
|
UINT_FAST64_MAX |
|
|
|
||
|
|
|
|
|
|
|
|
|
31 Это не более чем условность – на самом деле вводимые «скоростные» типы, как и все предыдущие, есть всего |
|
|
|
|||
лишь синонимы ранее определенным, т.е. обрабатываются компилятором абсолютно с той же скоростью. Очевидно, эти |
|
|
|
||||
типы введены для совместимости с GCC для других платформ. |
|
|
|
Продолжение в №11/2010 |
|||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 1
Радиолюбитель – 10/2010
