Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

А по СистПрогр. на Си тут помогают?

14K
06 декабря 2005 года
dao
4 / / 06.12.2005
RightShift+RightCtrl+F8 должны выключить в текстовом наборе клавишу "8", а при повторном их нажатии опять включить.

У меня при нажатии вылет вообще из среды :(

#include <stdio.h>
#include <dos.h>
#include <conio.h>

void (interrupt *old9)(void); /* Старый обработчик прерывания 9h */
void interrupt new9(void); /* Новый обработчик прерывания 9h */
/* void *readvect (int in); /* Чтение вектора */
/* void writevect (int in,void *h); /* Запись вектора */

unsigned char F8_code=119; /* scan-code "F8" */
unsigned char key8_code=56;/* scan-code "8" */
char f=0; /* Флаг */
union REGS rr;
struct SREGS sr;

/* Чтение вектора *
void *readvect(int in)
{
rr.h.ah=0x35;
rr.h.al=in;
intdosx(&rr,&rr,&sr);
return(MK_FP(sr.es,rr.x.bx));

}
/*-------------------------*/
/* Запись вектора *
void writevect(int in,void *h)
{
rr.h.ah=0x25;
rr.h.al=in;
sr.ds=FP_SEG(h);
rr.x.dx=FP_OFF(h);
intdosx(&rr,&rr,&sr);
}
/*------------------------------*/
/* Новый обработчик 9-го прерыванмя */
void interrupt new9()
{
unsigned char c,x,y;
unsigned char byte17;
unsigned char mask=0x01;
unsigned char mask17=0x04;
byte17=peekb(0x40,0x17);

if((inportb(0x60)==F8_code)&&(byte17&mask)&&
(byte17&mask17))
{
cputs("\7");
x=wherex();
y=wherey();
gotoxy(55,3);
textattr(0x1e);
if(f==0)
{
f=1;
cprintf("klavisha \"8\" block ");
}
else
{
f=0;
cprintf("klavisha \"8\" unblock ");
}
gotoxy(x,y);
textattr(0x07);
(*old9)();
}
if( (f==1) && (inportb(0x60)==key8_code) )
{
c=inportb(0x61);
outportb(0x61,c|0x80);
outportb(0x61,c);
outportb(0x20,0x20);
}
else
(*old9)();
}
/*-----------------------------*/
void main(void)
{
char string[80]; /* Буфер для ввода текста */
clrscr();
textattr(0x0a);
cprintf(" Upravlenie klaviaturoy ");
old9=_dos_getvect(0x9);
_dos_setvect(0x9,new9);
textattr(0x0c);
cprintf("\n\n\r\"gorja4aja\" kombinacija: ");
cprintf("Right Shift, Right Ctrl, F8\n\r");
cprintf("Klavisha, kotoraja blokiruetsja: ");
textattr(0x0f);
cprintf("8");
cprintf("\r\nvvedite stroku simvolov>");
cscanf("%s",string);
_dos_setvect(0x9,old9);
}
243
07 декабря 2005 года
pacific_7
1.9K / / 06.09.2004
А-а-а-а-а-а!!! Убей себя!!! ;) Это же винда!!! В ней нет прерываний и outportb()!!! Если конечно ты не пишешь драйвер режима ядра. Но что-то я сомневаюсь.
1.7K
07 декабря 2005 года
Envel
206 / / 29.11.2004
Цитата:
Originally posted by pacific_7
В ней нет прерываний и outportb()!!! Если конечно ты не пишешь драйвер режима ядра. Но что-то я сомневаюсь.


Прерывания есть, никуда они не денутся. Только вот реализация будет совсем другая (защищенный режим). Прерывания в v86 тоже эмулируются, но вот outportb вызывает ошибку защиты.
Это надо в real mode DOS запускать или vmware, dosbox (второе лучше).

243
07 декабря 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Envel
Прерывания есть, никуда они не денутся. Только вот реализация будет совсем другая (защищенный режим).


Сенк, знаю. См. последнее предложение предыдущего поста. Если имеется ввиду программа для винды - то считай что их нет. Если не драйвер и прочие вещи режима ядра.

14K
08 декабря 2005 года
dao
4 / / 06.12.2005
Цитата:
Originally posted by Envel
Прерывания есть, никуда они не денутся. Только вот реализация будет совсем другая (защищенный режим). Прерывания в v86 тоже эмулируются, но вот outportb вызывает ошибку защиты.
Это надо в real mode DOS запускать или vmware, dosbox (второе лучше).





А как это запускать в real mode DOS или vmware, dosbox? Я наверно мегачайник :) и запускаю из турбоС. Э-э-э, можно поподробнее про эти два способа запуска?

14K
08 декабря 2005 года
dao
4 / / 06.12.2005
Цитата:
Originally posted by pacific_7
Сенк, знаю. См. последнее предложение предыдущего поста. Если имеется ввиду программа для винды - то считай что их нет. Если не драйвер и прочие вещи режима ядра.



pacific_7 А я не знаю для чего пишу: Dosa чи Винды :( Задание у меня такое. Дали вот образец только с другими клавишами. Сказано было в турбоС делать. Я вот свои клавиши подставила, поотлаживала. А дальше серых клеточек не хватает. Трудно на заочном учиться. Может ссылочку на умную литературу кинешь? Учебник Деревянко уже прочитала - фигня!!!

243
08 декабря 2005 года
pacific_7
1.9K / / 06.09.2004
Офтоп: Гы! Девчонка (правда на 5 лет меня старше, если верить профилю). :) Тогда извиняюсь. Только не надо это воспринимать как половую дискриминацию, я по этому поводу уже неоднократно высказывался, если интересно, то см. форум, не помню где.
Ты кстати не с Кубани случайно?
Цитата:
Originally posted by dao
pacific_7 А я не знаю для чего пишу: Dosa чи Винды :( Задание у меня такое.


Та-а-ак. А в какой операционной системе должна программа запускаться и работать? Если в Windows, то твоя прога и пример не будут работать в семействе NT - это собственно Windows NT, 2000, 2003, XP и все что будет позже. Только в 95, 98, Me.

Цитата:
Originally posted by dao

Дали вот образец только с другими клавишами.


Задание наверное десятилетней давности. Бывает у нас такое в учебных заведениях :(

Цитата:
Originally posted by dao
Сказано было в турбоС делать. Я вот свои клавиши подставила, поотлаживала. А дальше серых клеточек не хватает.


Очередной идиётизьм наших преподов: делать в турбо Це и ни как иначе. Ведь на деле - в общем-то пофигу в чем делать.
Значит так, если делать для ДОС, то я точно не помощьник, т.к. никогда ничего под него не писал и не собираюсь: "мертвая ОС" по выражению самих MS.
Если под винду, то нужен тебе Джеффри Рихтер, вот ссылка: http://forum.codenet.ru/showthread.php?s=&threadid=27618 - там много чего еще полезного выложено.
Конкретно, тебе надо использовать системные ловушки Windows создаваемые при помощи функции SetWindowsHookEx(...), только вот тогда придется еще и dll отдельную создавать. Об этом всем подробно написано у Рихтера. Только как начинающая - боюсь мало что поймешь. Но попробуй.
Ну и я гляну как реализовать - интересно стало, может че получится. Тогда выложу код.

Цитата:
Originally posted by dao

Трудно на заочном учиться.


Наверное, не знаю - не пробовал еще :)

1.7K
08 декабря 2005 года
Envel
206 / / 29.11.2004
pacific_7, ты что-то все усложняешь. Не порть бедной девушке жизнь :)
dosbox - эмулятор DOS, работает прямо из Windows в окне. В нем надо свой Turbo C запускать. Либо загружать компьютер с загрузочной дискеты, запускать свой любимый Turbo C и работать (а это real mode DOS).
243
08 декабря 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Envel
pacific_7, ты что-то все усложняешь. Не порть бедной девушке жизнь :)


Ну, блин, мне кажется что щас уже имеет смысл писать под винды, а не под DOS. Это если действительно хочется научиться.
Ну а если только что бы задание выполнить - то тогда твой вариант оптимальный. Можно конечно предположить что девушка собралась писать ОС или драйвер :), тогда то же надо делать по твоему. Но что-то я сомневаюсь что здесь именно этот вариант.

2.0K
11 декабря 2005 года
integral
86 / / 12.11.2005
Если прога должна только демонстрировать подобную возможность, то проще воспользоватся ф-цией bioskey(cmd).
Прочитай доку об использовании, при сmd=2 8-ой бит результата в 1, прога для определения нажатия не тригерных клавиш :
for(; ; )
{
printf("0x%04x\n", bioskey(0));
}
2.0K
11 декабря 2005 года
integral
86 / / 12.11.2005
рекомендую стандарт Си, или Риччи и Кернигана "язык Си"
20K
02 ноября 2006 года
Nizhnekamsk
5 / / 02.11.2006
Помогите с программой пишет о переполнении всё пробовал, что знал
Код:
#include"stdio.h"
#include"math.h"
#include"conio.h"
 
double F1 (double x)
{double a,s1;
int k;
a=x; s1=a;
for (k=1;fabs (a)>1e-6*fabs(s1);k++)
{a*=-(x*x)/((2*k+1)*(2*k));
s1+=a;}
return s1;}
 
double F2 (double x)
{double a,s2;
int k;
a=x; s2=a;
for (k=1;fabs (a)>1e-6*fabs(s2);k++)
{a*=-(x*x)/((2*k-1)*(2*k));
s2+=a;}
return s2;}
 
double f(double x)
{double m,n;
m=F1(x);
n=F2(x);
return (n-m)*(n+m);
}
double Intgr (double a,double b)
{double x,In,I2n;
int n,i;
I2n=(f(a)+f(b))/2*(b-a);
n=1;
In=I2n+100;
while (fabs(In-I2n)>1e-6*fabs(I2n))
{n*=2;In=I2n;I2n=0;
for (i=0;i<n;i++)
{x=a+0.1*i;
I2n+=0.1*(f(x)+f(x+0.1))/2;
}
}
return I2n;
}
void main()
{double x,y,z;
clrscr();
for (x=0;x<1;x+=0.1)
{printf("\v x=%g",&x);
y=Intgr(0,1);
printf("\t int=%g",y);
z=abs(y-0.5*sin(2*x));
printf("\t z=%g",z);
}
}
242
05 ноября 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Помогите с программой пишет о переполнении всё пробовал, что знал


о каком переполнении? напиши error message.

63
07 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
И по этой теме, думаю , было бы лучше спрошивать совет в разделе WinAPI.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог