Переполнение буфера клавиатуры

  • Автор темы APTEM
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

APTEM

Простейшая музыкальная программа. Проблема в том, что при долгом нажатии на клавишу (музыка активируется при нажатии на z,x,c,v,b,n) звук ведет себя очень странно. Кажется переполнение буфера клавиатуры. Как можно решить эту проблему?

uses crt,graph;

var ch:char;
i,j:integer;
ch1: byte;

procedure Sound(cc: byte; i:integer;F:single);
var k:word;
c:byte;
begin
k:=round(1.193e6/f);
port[$43]:=$be;
port[$42]:=lo(k);
port[$42]:=hi(k);

setfillstyle(1,12);
bar(i*50,100,(i+1)*50-5,300);

c:=port[$61];
port[$61]:=c or 3;
repeat until (port[$60]<>cc);
port[$61]:=c and (not 3);

setfillstyle(1,i);
bar(i*50,100,(i+1)*50-5,300);

end;

begin

i:=detect;
initgraph(i,j,'d:\tp7');{pri zapisi na disk C:\ zamenit d:\tp7 na c:\tp7}

for i:=1 to 7 do
begin
setfillstyle(1,i);
bar(i*50,100,(i+1)*50-5,300);
end;

repeat
ch1:=port[$60];
(* writeln(port[$60]);*)
case ch1 of
(44):sound(ch1,1,440);
(45):sound(ch1,2,460);
(46):sound(ch1,3,490);
(47):sound(ch1,4,530);
(48):sound(ch1,5,590);
(49):sound(ch1,6,650);
(50):sound(ch1,7,720);

end;
until ch1=27;

closegraph;
end.
 
A

admin

APTEM
нормально
а почему странно? звучит главное :blink:
 
G

Guest

Серёга
При длинном нажатии звучит уже не нормально. Или при нажатии на кнопки более 15 раз звучит тоже ненормально. В этом все и дело.
 
A

admin

Guest
ну да
переполнение
как решить хз. знаю что даже МС не решило её в досе. попробуй запусти цикл и подержи та клавишу, всё станет понятно. даже повесить можно комп.
 
S

saver

Тебе просто надо очищать буффер... Вот посмотри..., тут почти вся твоя прога, я только добавил одну процедуру и вызвал её в цикле твоей...

Program FortePiano;
Uses Crt, Graph;
Var GraphDriver, GraphMode: Integer;
Ch: Byte; i: Integer;

Procedure FreeKeyBoardBuffer;
Var Ch: Char;
Begin
While KeyPressed Do Begin
ch:=ReadKey;
End;
End;

Procedure Sound(Key: Byte; i: Integer; f:real);
Var k: Word;
c: Byte;
Begin
k:=Round(1.193e6/f);
port[$43]:=$be;
port[$42]:=lo(k);
port[$42]:=hi(k);

SetFillStyle(1, 12);
Bar(i*50, 100, (i+1)*50-5, 300);
c:=port[$61];
port[$61]:=c Or 3;

Repeat FreeKeyBoardBuffer Until port[$60]<>Key;
port[$61]:=c And (Not 3);
SetFillStyle(1, i);
Bar(i*50, 100, (i+1)*50-5, 300);
end;

Begin
GraphDriver:=Detect;
InitGraph(GraphDriver, GraphMode, 'C:\bp\Bgi');

For i:=1 To 7 Do Begin
SetFillStyle(1, i);
Bar(i*50, 100, (i+1)*50-5, 300);
End;

Repeat
Ch:=port[$60];
(* writeln(port[$60]);*)
Case Ch Of
44:sound(Ch,1,440);
45:sound(Ch,2,460);
46:sound(Ch,3,490);
47:sound(Ch,4,530);
48:sound(Ch,5,590);
49:sound(Ch,6,650);
50:sound(Ch,7,720);
End;
Until Ch=27;
CloseGraph;
End.

... вот и все проблемы. :)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях: