Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2012, 16:38   #1
Maksimall89
Пользователь
 
Аватар для Maksimall89
 
Регистрация: 10.11.2010
Сообщений: 59
Стрелка Прерывание от таймера

Нужно написать программу реализующую аппаратное прерывание от таймера, генерирующую звук от 700 до 1200 Гц каждые 3 секунды.
Вот, что получилось, но не компилируется. (Среда BC 3.0 C++)
Код:
#include <dos.h> 
#include <stdio.h>
#include <conio.h>
#include <bios.h>

unsigned long far *count =  (unsigned long far*) MK_FP(0x0040, 0x006c); // тут храниться время

void interrupt mybeep(void) // моё прерывание
{
	int i;
	if (*count % 54L == 0) // берем каждую 3 секунду 18*3
	{
		for(i = 0; i <= 1200; i++) 
			sound(700 + i/30);
		nosound(); 
	}
}

int main(void)
 {
	clrscr();
	void interrupt (*oldvect)(void);
	oldvect = getvect(0x1c); // получаем значение вектора прерываний
	setvect(0x1c, mybeep); 	// создаем свое прерывание
	printf("Для выхода из тишины, нажмите любую клавишу...\n"); 
	getch();
	setvect(0x1c, oldvect);  // восстанавливаем значения
	return 0;
}
Хотелось бы узнать, где ошибка и как её исправить.
Maksimall89 вне форума Ответить с цитированием
Старый 05.10.2012, 17:36   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Когда не компилируется, компилятор обычно пишет какая ошибка и где...
Кстати, а где у вас увеличивается count?
waleri вне форума Ответить с цитированием
Старый 05.10.2012, 18:09   #3
Maksimall89
Пользователь
 
Аватар для Maksimall89
 
Регистрация: 10.11.2010
Сообщений: 59
По умолчанию

Вот что выводит.
Снимок.jpg
Как было написано в методе, это указатель, на область памяти и всё.
Мне самому это интересно как он увеличивается.
Я сразу скажу, что пишу в первый раз под dos и к тому же в bc.
Maksimall89 вне форума Ответить с цитированием
Старый 05.10.2012, 20:52   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

setvect() получает указатель на функцию определенного типа. Судя по ошибке, mybeep не соотвествует этому типу
waleri вне форума Ответить с цитированием
Старый 05.10.2012, 21:58   #5
Maksimall89
Пользователь
 
Аватар для Maksimall89
 
Регистрация: 10.11.2010
Сообщений: 59
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
setvect() получает указатель на функцию определенного типа. Судя по ошибке, mybeep не соотвествует этому типу
interrupt определяет что это прерывание, другой тип я дать не могу.
Если я правильно всё понимаю.
Maksimall89 вне форума Ответить с цитированием
Старый 05.10.2012, 22:17   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Попробуйте аргумент (void) заменить на (...) - ведь ето же написано в ошибке...

http://www.velocityreviews.com/forum...d-c-3-1-a.html

Последний раз редактировалось waleri; 05.10.2012 в 22:21.
waleri вне форума Ответить с цитированием
Старый 05.10.2012, 23:15   #7
Maksimall89
Пользователь
 
Аватар для Maksimall89
 
Регистрация: 10.11.2010
Сообщений: 59
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Попробуйте аргумент (void) заменить на (...) - ведь ето же написано в ошибке...

http://www.velocityreviews.com/forum...d-c-3-1-a.html
Если так прописать уходить лишь ошибка из 24 строки.
Maksimall89 вне форума Ответить с цитированием
Старый 05.10.2012, 23:44   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А так надо прописать в *двух* местах
waleri вне форума Ответить с цитированием
Старый 06.10.2012, 11:22   #9
Maksimall89
Пользователь
 
Аватар для Maksimall89
 
Регистрация: 10.11.2010
Сообщений: 59
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А так надо прописать в *двух* местах
Спасибо, заработало!
Если кому понадобиться:
Код:
// Аппаратное прерывание от таймера, генерация звука от 700 до 1200 Гц каждые 3 секунды
#include <dos.h> 
#include <stdio.h>
#include <conio.h>
#include <bios.h>

unsigned long far *count =  (unsigned long far*) MK_FP(0x0040, 0x006c); // тут храниться время

void interrupt mybeep(...) // моё прерывание
{
	int i;
	if (*count % 54L == 0) // берем каждую 3 секунду 18*3
	{
		for(i = 0; i <= 1200; i++) 
			sound(700 + i/30);
		nosound(); 
	}
}

int main(void)
 {
	clrscr();
	void interrupt (*oldvect)(...);
	oldvect = getvect(0x1c); // получаем значение вектора прерываний
	setvect(0x1c, mybeep); 	// создаем свое прерывание
	printf("Для выхода из тишины, нажмите любую клавишу...\n"); 
	getch();
	setvect(0x1c, oldvect);  // восстанавливаем значения
	return 0;
}
Maksimall89 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прерывание от таймера 08h Hacker19_90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 20.12.2011 01:07
Прерывание VKorablev Паскаль, Turbo Pascal, PascalABC.NET 5 15.04.2011 21:12
6 прерывание ленусик Фриланс 1 03.06.2008 16:22
6 прерывание ленусик Помощь студентам 5 30.05.2008 16:57