Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
ВнизРабота со звуком в Turbo Pascal 7.0 Найти похожие ветки
← →
Александиров (2008-10-31 11:53) [0]Нашёл в Интернете пример программы работы со звуком:
Program MusicColor;
Uses Crt, Graph; {подключение к программе библиотек Crt и Graph}
Var
GrDriver, GrMode: Integer; {тип и режим работы графического драйвера}
BEGIN
GrDriver := Detect; {автоопределение типа графического драйвера}
InitGraph(GrDriver, GrMode, "C:\TP\BGI"); {установка графического режима}
SetColor(White); {установка белого цвета рамки }
Rectangle(130, 130, 460, 370); {рисование рамки }
Randomize; {инициализация датчика случайных чисел}
Repeat {цикл прерывается нажатием любой клавиши}
Sound(Random(2000)); {изменение высоты звука }
Delay(Random(1000)); {задержка }
SetFillStyle(Random(4), Random(16)); {смена типа штриховки и цвета}
Bar(140, 140, 450, 360); {рисование закрашенного прямоугольника}
until KeyPressed;
NoSound; {отмена звука }
CloseGraph; ReadLn; {закрытие графического режима}
END.
Компилирию - всё нормально, запускаю на выполнение выдаёт ошибку: Error 200: Division by zero
Упрощаю программу:
Program Music;
Uses Crt;
BEGIN
Sound(1000);
Delay(1000);
NoSound;
END.
Всё равно выдаёт туже ошибку. Подскажите почему, что я делаю не так?
← →
Palladin © (2008-10-31 11:59) [1]Все так. Только времена уже не те. Компьютеры очень быстрые. :)
← →
Palladin © (2008-10-31 12:00) [2]Где то видел лет 6-8 назад в инете "патч" модуля Crt. Поищи...
← →
Александиров (2008-10-31 12:01) [3]А как можно это исправить? Какой компилятор нужно скачать, чтобы программа работала?
← →
Александиров (2008-10-31 12:03) [4]Спасибо, поищу
← →
Александиров (2008-10-31 12:03) [5]Спасибо, поищу
← →
Vlad Oshin © (2008-10-31 12:06) [6]
> А как можно это исправить?
> "патч" модуля Crt
> Поищи...
или переписать delay процедуру
навроде
var=gettime;
repeat
until gettime>var+DelayVar;
← →
Anatoly Podgoretsky © (2008-10-31 12:24) [7]> Александиров (31.10.2008 12:01:03) [3]
Никакой, надо процедуры работы с таймером переводить на 32 бита. Все остальные патчи дают только частичные или вообще неверную работу. Надо просто сделать поиск по проблеме в Интернете и найти сайт, где собраны методы борьбы. Патчи используют если нет исходников, а при наличии исходников, просто переписывают модуль CRT
Division by zero - на самом деле реальная ошибка, это ошибка деления на 55. Цикл работы системного таймера = 55 мс.
← →
Сергей М. © (2008-10-31 12:37) [8]
> Anatoly Podgoretsky © (31.10.08 12:24) [7]
> Division by zero - .. это ошибка деления на 55
Ну ты, Анатолий, и загнул)
Деление на ноль - это, оказывается, ничто иное как деление на 55)
Эдаким заявлением можно запросто кого-угодно поставить в ступор, ввергнуть в состояние глубокого травматического мозгового шока)
← →
DrPass © (2008-10-31 12:48) [9]
> или переписать delay процедуру
> навроде
> var=gettime;
> repeat
> until gettime>var+DelayVar;
Не получится. Расчет интервалов для Delay производится в секции инициализации модуля Crt (естественно, не той, которая initialization, ее в Паскале не было). Т.е. чтобы получить эту ошибку, достаточно uses crt сделать
← →
Vlad Oshin © (2008-10-31 13:13) [10]
> чтобы получить эту ошибку, достаточно uses crt сделать
согласен, забыл
← →
Рамиль © (2008-10-31 13:46) [11]DosBox не поможет?
← →
Anatoly Podgoretsky © (2008-10-31 14:01) [12]> Сергей М. (31.10.2008 12:37:08) [8]
Все претензии к Интел и ИБМ
← →
Amoeba © (2008-10-31 14:31) [13]
> Компилирию - всё нормально, запускаю на выполнение выдаёт
> ошибку: Error 200: Division by zero
Объяснение причины и решение найдешь здесь:
http://www.brain.uni-freiburg.de/~klaus/pascal/runerr200/
← →
Сергей М. © (2008-10-31 14:55) [14]
> Anatoly Podgoretsky © (31.10.08 14:01) [12]
> претензии к Интел и ИБМ
>
Довольно странно пенять на железных брендов, в то время как видимая часть проблемы в элементарном ляпе софтового бренда)
Нет бы написать, мол, приключилось переполнение)
← →
Jeer © (2008-10-31 15:03) [15]Как быстро все забывается, а ведь десять лет - не такое уж большое время.
Вспомнить, хотя бы, примерно аналогичную проблему на Clipper-e.
← →
Anatoly Podgoretsky © (2008-10-31 16:21) [16]> Сергей М. (31.10.2008 14:55:14) [14]
А мне непорятно зачем они назвали Division by zero/Divide by zero
Когда это частный случай, в данном случае ошибка возникает при деление на 55 (пятьдесят пять)
← →
Германн © (2008-10-31 16:22) [17]
> Сергей М. © (31.10.08 14:55) [14]
>
>
> > Anatoly Podgoretsky © (31.10.08 14:01) [12]
>
>
> > претензии к Интел и ИБМ
> >
>
>
> Довольно странно пенять на железных брендов, в то время
> как видимая часть проблемы в элементарном ляпе софтового
> бренда)
>
+1
Вот в TpCrt такого ляпа нет и не было, а он более старый, чем Crt от ТР7.
← →
Palladin © (2008-10-31 16:23) [18]Насколько я помню, ошибка возникает не в результате деления на 55, а в результате деления на результат деления на 55. :) Нехватило там точности для результата деления на 55 :)... и, конечно, вполне могу и ошибаться...
← →
Anatoly Podgoretsky © (2008-10-31 16:30) [19]
> Amoeba © (31.10.08 14:31) [13]
Именно этот сайт и имел в виду, там объяеснение и несколько лечилок разного уровня.
← →
Сергей М. © (2008-10-31 16:30) [20]
> мне непорятно зачем они назвали Division by zero/Divide
> by zero
Мне тоже.
Поэтому и предполагаю, что это банальный ляп.
> это частный случай
Это как ?
Ошибка деления на ноль есть частный случай ошибки переполнения, ты это имел ввиду ?
Ну дальнее родство тут, конечно, имеется, но ошибка-то возбуждается не по родству, а конкретно либо по прерыванию (причина - деление на ноль) либо по анализу установленного флага OF (как результат переполнения при выполнении арифм.инструкции)
← →
Anatoly Podgoretsky © (2008-10-31 16:57) [21]> Palladin (31.10.2008 16:23:18) [18]
Вообще то ошибаешсь, именно происходит деление на 55 накопленного за 55 мсек счетчика.
В результате деления долно получиться меньше или равно 65535, а счетчик много больше 65536*55
У меня претензии не к реализации, а к сообщению об ошибке. И к этому приложили руку два этих гиганта, Интел более виноват.
← →
Palladin © (2008-10-31 16:58) [22]
> Вообще то ошибаешсь
так и знал, значит воспоминания из какой то другой оперы...
← →
Anatoly Podgoretsky © (2008-10-31 17:04) [23]> Palladin (31.10.2008 16:58:22) [22]
Я уверено говорю, потому что тот код у меня как перед глазами, на всю жизнь запомнил.
Алгоритм там простой, в цикле, в течение 55 мсек (полный оборот таймера и прерывание) на каждой итеррации наращивается счетчкик, по окончанию счетчик делится на 55, для получения интервала в 1 мсек, что далее используется в функции Delay. По мере роста частот, счетчик стал переполняться.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c