Описание функций Си

         

Harderr



     harderr

Функция Устанавливает подпрограмму обработки ошибок электронного оборудования.

Синтаксис #include

void harderr(*handler)());

Файл, содержащий dos.h прототип

Описание Функция harderr устанавливает подпрограмму обра- ботки сбоев электронного оборудования для текущей программы. Данная подпрограмма вызывается к рабо- те, как только возникнет прерывание 0x24. (см. документ "Справочное руководство программиста для DOS").

При появлении данного прерывыания происходит вы- зов функции handler. Функция должна быть вызвана со следующими аргументами:

handler(int errval, int ax, int bp, int si);

Переменная errval - код ошибки, устанавливаемый DOS в регистре DI. ax, bp и si - значения, кото- рые MS-DOS помещает соответственно в регистры AX,BP,SI.

- параметр ax обозначает, произошла ли ошибка диска или какого-либо другого устройства. Если ax не отрицательно, произошла дисковая ошибка, в противном случае, это ошибка другого устройства. Для дисковой ошибки значение ax, сложенное логи- чески (операцией AND) с 0x00FF, даст номер диско- вода, в котором произошел сбой (1=A; 2=B; и т.д.).

- bp и si вместе указывают на заголовок драйвера устройства, в котором произошел сбой. bp содержит адрес сегмента, а si смещение.

Названная выше функция не вызывается непосредст- венно. Функция harderr устанавливает подпрограмму обработки прерываний DOS, которая вызывает функ- цию. Для получения информации из заголовка драй- вера можно использовать функции peek и peekb.

Программа - обработчик прерываний может использо- вать системные вызовы DOS от 1 до 0xC, все ос- тальные вызовы портят DOS. В частности, не могут быть использованы ни любые стандартные подпрог- раммы ввода/вывода CИ, ни любые подпрограммы вво- да/вывода эмуляции UNIX.

Программа обработки прерывания должна возвращать 0, если необходимо игнорировать ошибку, 1, если нужно повторить операцию и 2 для завершения прог- раммы.

Возвращаемое Нет. значение

Переносимость Функция уникальна для DOS.


Смотрите также

Пример:

#include



#include

#include

#define IGNORE 0 #define RETRY 1 #define ABORT 2

/* определим сообщения об ошибке для дисковода */ static char *err_msg[] = {"диск защищен от записи", "неизвестное устройство", "дисковод не готов", "неизвестная команда", "ошибка данных (CRC)", "ошибка поиска", "неизвестный тип носителя", "ненайден сектор", "в принтере нет бумаги", "сбой при записи", "ошибка при чтении", "неустранимая ошибка", "зарезервирован", "зарезервирован", "неверная смена диска" };

error_win(char *msg) { int retval; cputs(msg); /* запрос у пользователя дальнейших действий */ while(1) { retval = getch(); if(retval == 'a' retval == 'A') { retval = ABORT; break; } if(retval == 'r' retval == 'R') { retval = RETRY; break; } if(retval == 'i' retval == 'I') { retval = IGNORE; break; } } return(retval); } /* прагма warn -par исключае выдачу предупреждений о том, что в подпрограмме не используются параметры errval,bp и si */

#pragma warn -par

int handler(int errval, int ax, int bp, int si) { static char msg[80]; unsigned di; int drive; int errno; di = _DI; /* если это не ошибка диска, то проблемы возникли у другого устр-ва */ if(ax


Hardresu



     hardresume

Функция Функция обработки ошибок электронного оборудова- ния.

Синтаксис #include

void hardresume(int rescode);

Файл, содержащий dos.h прототип

Описание Программа обработки ошибочных состояний, устанав- ливаемая функцией harderr может использовать фун- кцию hardresume для возврата управления DOS. Воз- вращаемое значение rescode должно содержать инди- катор, определяющий игнорирование ошибки (0), повторение операции (1) или завершение программы (2). Завершение программы выполняется посредством прерывания DOS 0x23.

Программа обработки прерывания должна возвращать 0, если необходимо игнорировать ошибку, 1, если нужно повторить операцию и 2 для завершения прог- раммы.

Возвращаемое Нет. значение

Переносимость Функция уникальна для DOS.

Смотрите также

Пример:

/* Эта программа отслеживает появление ошибок, и запрашивает у пользователя дальнейшие действия. Для того, чтобы была вызва- на подпрограмма обработки ошибок, запуская программу, выньте из дисковода А: диск. */

#include

#include

#include

#define IGNORE 0 #define RETRY 1 #define ABORT 2

/* определим сообщения об ошибке для дисковода */ static char *err_msg[] = {"диск защищен от записи", "неизвестное устройство", "дисковод не готов", "неизвестная команда", "ошибка данных (CRC)", "ошибка поиска", "неизвестный тип носителя", "ненайден сектор", "в принтере нет бумаги", "сбой при записи", "ошибка при чтении", "неустранимая ошибка", "зарезервирован", "зарезервирован", "неверная смена диска" };

error_win(char *msg) { int retval; cputs(msg); /* запрос у пользователя дальнейших действий */ while(1) { retval = getch(); if(retval == 'a' retval == 'A') { retval = ABORT; break; } if(retval == 'r' retval == 'R') { retval = RETRY; break; } if(retval == 'i' retval == 'I') { retval = IGNORE; break; } } return(retval); } /* прагма warn -par исключае выдачу предупреждений о том, что не в подпролграмме не используются параметры errval,bp и si */ #pragma warn -par

int handler(int errval, int ax, int bp, int si) { static char msg[80]; unsigned di; int drive; int errno; di = _DI; /* если это не ошибка диска, то возникли проблемы у другого устр-ва */ if(ax



Hardretn



     hardretn

Функция Функция обработки ошибок электронного оборудова- ния.

Синтаксис void hardretn(int errcode);

Файл, содержащий dos.h прототип

Описание Программа обработки ошибочных состояний, устанав- ливаемая подпрограммой harderr, может осуществить возврат управления прикладной программе с помощью функции hardretn.

Программа обработки прерывания должна возвращать 0, если необходимо игнорировать ошибку, 1, если нужно повторить операцию и 2 для завершения прог- раммы.

Возвращаемое Нет. значение

Переносимость Функция уникальна для DOS.

Смотрите также

Пример:

/* Эта программа отслеживает появление ошибок, и запрашивает у пользователя дальнейшие действия. Для того, чтобы была вызва- на подпрограмма обработки ошибок, запуская программу, выньте из дисковода А: диск. */

#include

#include

#include

#define IGNORE 0 #define RETRY 1 #define ABORT 2

/* определим сообщения об ошибке для дисковода */ static char *err_msg[] = {"диск защищен от записи", "неизвестное устройство", "дисковод не готов", "неизвестная команда", "ошибка данных (CRC)", "ошибка поиска", "неизвестный тип носителя", "ненайден сектор", "в принтере нет бумаги", "сбой при записи", "ошибка при чтении", "неустранимая ошибка", "зарезервирован", "зарезервирован", "неверная смена диска" };

error_win(char *msg) { int retval; cputs(msg); /* запрос у пользователя дальнейших действий */ while(1) { retval = getch(); if(retval == 'a' retval == 'A') { retval = ABORT; break; } if(retval == 'r' retval == 'R') { retval = RETRY; break; } if(retval == 'i' retval == 'I') { retval = IGNORE; break; } } return(retval); } /* прагма warn -par исключае выдачу предупреждений о том, что не в подпролграмме не используются параметры errval,bp и si */ #pragma warn -par

int handler(int errval, int ax, int bp, int si) { static char msg[80]; unsigned di; int drive; int errno; di = _DI; /* если это не ошибка диска, то возникли проблемы у другого устр-ва */ if(ax



Heapchec



     heapchecknode

Функция Ищет и проверяет отдельный узел памяти.

Синтаксис #include

int heapchecknode(void *node);

Файл, содержащий alloc.h прототип

Описание Если узел был освобожден и heapchecknode вызы- вается с указателем на освобожденный узел, то heapchecknode может вернуть значение _BADNODE, вместо предполагаемого _FREEENTRY. Это происходит потому, что соседние свободные блоки сливаются, и блок, указанный при вызове функции, больше не су- ществует.

Возвращемое При ошибке возращется значение < 0, при успешном значение завершение возвращается значение > 0.

Если нет памяти, то возвращается значение _HEAPEMPTY (1). Если память запорчена, то возвращается _HEAPCORRUPT(-1). Если узел не найден, то возвращается _BADNODE (-2). Если узел освобожден, то возвращается _FREEENTRY (3). Если узел, это используемый блок, то возвращается _USEDENTRY (4)

Переносимость heapcheckfree уникальна для DOS.

Смотрите также

Пример:

#include

#include

#define NUM_PTRS 10 #define NUM_BYTES 16

int main(void) { char *array[NUM_PTRS]; int i; for(i=0; i



Heapfill



     heapfillfree

Функция Заполняет свободные блоки памяти констнтным значением.

Синтаксис #include

int heapfillfree(unsigned int fillvalue);

Файл, содержащий alloc.h прототип

Описание ????????????????

Возвращемое При ошибке возращется значение < 0, при успешном значение завершение возвращается значение > 0.

Если нет памяти, то возвращается значение _HEAPEMPTY (1). Если память проверена,то возвращается_HEAPOK (2). Если память запорчена, то возвращается _HEAPCORRUPT(-1). Если зачение заполнения отличается от fillvalue, то возвращается _BADVALUE (-3).

Переносимость heapfillfree уникальна для DOS.

Смотриет также farheapfillfree.

Пример:

#include

#include

#include

#define NUM_PTRS 10 #define NUM_BYTES 16

int main(void) { char *array[NUM_PTRS]; int i; int res; for(i=0; i



Heapwalk



     heapwalk

Функция Используется для перемещенмия по памяти от узла к узлу.

Синтаксис #include

int heapwalk(struct heapinfo *hi);

Файл, содержащий alloc.h прототип

Описание heapwalk подразумевает, что память не запорчена. Для проверки, перед использованием heapwalk, вы- зовите heapcheck. При достижении последнего бло- ка, функция возвращает _HEAPOK. При следующем вы- зове heapwalk, она вернет _HEAPEND.

heapwalk получает указатель на структуру типа heapinfo (определена в файле alloc.h). При первом вызове heapwalk установите поле hi.ptr в 0. farheapwalk вернет вам в этом поле адрес первого блока памяти. Поле hi.size содержит размер этого блока в байтах. hi.in_use - это флаг, который ус- танавливается, если этот блок используется в нас- тоящий момент.

Возвращемое Если нет памяти, то возвращается значение значение _HEAPEMPTY (1). Если hiapinfo содержит допустимые данные, то возвращается _HEAPOK (2). Если достигнут конец памяти, то возвращается _HEAPEND (5).

Переносимость heapwalk уникальна для DOS.

Смотрите также

Пример:

#include

#include

#define NUM_PTRS 10 #define NUM_BYTES 16

int main(void) { struct heapinfo hi; char *array[NUM_PTRS]; int i; for(i=0; i



Highvide



     highvideo

Функция Устанавливает бит интенсивности.

Синтаксис #include

void highvideo(void);

Файл, содержащий conio.h прототип

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

Возвращаемое Нет. значение

Переносимость highvideo работает только на машинах, совместимых с IBM PC. Аналогичная функция есть в Turbo Pascal.

Смотрите также

Пример:

#include

int main(void) { lowvideo(); cprintf("Текст низкой интенсивности"); highvideo(); gotoxy(1,2); cprintf("Текст высокой интенсивности"); return 0; }



Hypot



     hypot

Функция Вычисляет гипотенузу прямоугольного треугольника.

Синтаксис #include

double hypot(double x, double y);

Файл, содержащий math.h прототип

Описание Функция hypot вычисляет значение z, где

z^2 = x^2 + y^2

и z >= 0

(это - эквивалент длины гипотенузы прямоугольного треугольника, если длины двух его сторон x и y).

Возвращаемое При успешном завершении, функция hypot возвращает значение число z- двойной точности. При ошибке (такой, например, как переполнение), функция hypot прис- ваивает глобальной переменной errno значение:

ERANGE - Результат превышает допустимое значение.

и сама возвращает значение HUGE_VAL.

Обработка ошибок для функции hypot может быть мо- дифицирована посредством функции matherr.

Переносимость Функция поддерживается на системах UNIX.

Пример:

#include

#include

int main(void) { double result; double x = 3.0; double y = 4.0; result = hypot(x,y); printf("Гипотенуза = %lf\n",result); return 0; }