![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
MuXa |
![]()
Сообщение
#1
|
Гость ![]() |
я хотел бы знать как в цикле фиксировать нажатие кнопки не останавливая при этом цикл ...
т.е. например в теле цикла х имзеняется по форуле x:=x+1; ... нажал что нада а цикл всё идёт и ёдет ... но уже x:=x+2; ... вот так вот ... за ответы заранее благодарен ! |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Для какого компилятора? Если ТР (не под Windows) - то написанием своего обработчика прерывания 09Н
|
Guest |
![]()
Сообщение
#3
|
Гость ![]() |
<< то написанием своего обработчика прерывания 09Н >>
а можно об этом поподробней ?... |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Вот каркас (так как написание процедур обработки прерываний - достаточно опасная вещь, я не буду писать ничего кроме "каркаса" программы с коментариями ):
uses Dos, Crt;P.S. А для чего это нужно, более конкретно можно описать? Возможно есть другой, более безопасный способ... |
xds |
![]()
Сообщение
#5
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата
Дополню: 1) скэн-код и флаг нажатия-отпускания можно получить из порта $60 (как значение элемента псевдомассива Port, e. g. x := Port[$60]). Младшие 7 бит полученного значения будут разны скэн-коду, а старший 7-й бит равен 0, если клавиша нажата и 1 - если отпущена; 2) вызывать "настоящий" обработчик Int 9 не всегда имеет смысл - например, в том случае, когда мы сами хотим организовать буферизацию событий клавиатуры (в этом случае необходимо перед выходом из обработчика сбрасывать контроллер прерываний: Port[$20] := $20). Цитата P.S. А для чего это нужно, более конкретно можно описать? Возможно есть другой, более безопасный способ... Да, это важно. Во многих случаях можно обойтись без подобных "махинаций" c IRQ1, используя, например, службы BIOS. -------------------- The idiots are winning.
|
Altair |
![]()
Сообщение
#6
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
а зачем такие трудности? Может быть тело цикла выполняется за довольно малое время, и достаточно обойтись
If Keypressed then begin c:=ord(readkey); {выполняем что нужно} end; смысл думаю ясен... И цикл не останавливается и никаких TSR и никаких обработчиков. Но это при условии, что тело цикла выполняется достаточно быстро... (то есть если он выполняется за час, то это не приемлимо ![]() -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Бродяжник |
![]()
Сообщение
#7
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Зачастую этот вопрос возникает, когда важно знать не то, нажималась ли какая-то клавиша перед выполнением очередной итерации цикла, а то, нажата ли она именно сейчас, или нет. Например, это важно в играх. Кроме того, через Keypressed нельзя отследить Ctrl, Shift, Alt etc. Я раньше все хотел написать какую-нить игрушку на ТР, и всякий раз упирался в клавиатуру. В конце концов я таки написал свой корявый обработчик Int09... после чего уперся в другие проблемы. <_< ...и они меня обломали.
|
FreeMan |
![]()
Сообщение
#8
|
- ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 480 Пол: Мужской Репутация: ![]() ![]() ![]() |
Отсюда вывод: работать с прерываниями в паскале - фигня, юзайте асм, проблем будет меньше.
-------------------- бб
|
Altair |
![]()
Сообщение
#9
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Глупость. все разговоры о том, что в Паскале что-то хуже делать чем где-то еще упираются в неправилое проектирование программы.
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
FreeMan |
![]()
Сообщение
#10
|
- ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 480 Пол: Мужской Репутация: ![]() ![]() ![]() |
... или недостаточный уровень умений программинга на данном языке.
-------------------- бб
|
MuXa |
![]()
Сообщение
#11
|
Гость ![]() |
![]() народ я то хотел змейку намутить ... типа не прерывая цикл менять напрвление движения ... я смотрю так это заморочки большие мож как то с другой стороны подойти к этому делу ? |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
MuXa
А можешь привести пример того цикла, в течении которого надо изменять направление движения? Как он у тебя реализован? |
SHnur |
![]()
Сообщение
#13
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 81 Пол: Мужской Реальное имя: Шурик Репутация: ![]() ![]() ![]() |
MuXa , вот ! Делай так :
Код if keypressed then begin key := readkey; if (key = #0) then key := readkey; end; А потом в зависимости от key изменяй координаты ... -------------------- Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом. |
MuXa |
![]()
Сообщение
#14
|
Гость ![]() |
Цитата MuXa , вот ! Делай так : Код Код if keypressed then begin key := readkey; if (key = #0) then key := readkey; end; А потом в зависимости от key изменяй координаты ... ВОТ ! ... это то что мне и было нужно ! спасибо ! |
suriv |
![]()
Сообщение
#15
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 234 Пол: Мужской Реальное имя: AHTOH Репутация: ![]() ![]() ![]() |
Цитата так как написание процедур обработки прерываний - достаточно опасная вещ А почему опасная ? :p2: -------------------- Хочу в репу !
Cмотри,а то ведь получишь! Админ. Не получит - его фиг догонишь! Админ №2. P.S Вы еще третьего админа притащите сюда :D ваш аффтар :D Звали? :D (админ № не помню какой) ха больше нифига не напишете афтар Уверен? (Moderator) А еще можно ? (супмодер) Хватит его мучать ! Избили уж... (админ) Не хватит. я тоже напишу (тоже Админ) |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
suriv
Малейшая ошибка - и вектор прерывания "засылается в космос" - то есть неведомо куда, результат может быть самым плачевным, вплоть до потери информации на харде... ![]() |
Guest |
![]()
Сообщение
#17
|
Гость ![]() |
вот я собССно чё намутил кому интересно ... можно выбирать скорость длинну и граници поля ... СПАСИБО всем за помшь ! |
xds |
![]()
Сообщение
#18
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Oleg_Z, интересно, каким боком TSR относятся к "Змейке"?.. ;) :D (хотя TSR-"Змейка" - это забавно...)
-------------------- The idiots are winning.
|
xds |
![]()
Сообщение
#19
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Код if keypressed then begin key := readkey; if (key = #0) then key := readkey; end; Расширенные коды BIOS всё же стоит обрабатывать отдельно от ASCII, в противном случае мы, например, получим дополнительное управление клавишами H, K, M, P (что, впрочем, можно рассматривать как "undocumented feature") ![]()
-------------------- The idiots are winning.
|
Guest |
![]()
Сообщение
#20
|
Гость ![]() |
вот в догонку кому еще интересно ...
всё выглядит как нормальная змейка толко пака без собирания фруктов и терь она сама в себя врезается и транспортикуется при врезании в стену ... короче почти полноценная змея!
|
![]() ![]() |
![]() |
Текстовая версия | 21.07.2025 5:27 |